BaseTools: Enable Pcd Array support.

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

This patch is going to enable Array data type for PCD.

1. Support Pcd ARRAY as Structure PCD type
   including basic datatype array and structure array.
   For example:
   gStructuredPcdPkgTokenSpaceGuid.PcdTest|{0x0}|TEST[10]|0x00010080
   gStructuredPcdPkgTokenSpaceGuid.PcdTest2|{0x0}|UINT8[10]|0x00010081
2. Support C CODE style value initialization in DEC/DSC.
   For example:
gStructuredPcdPkgTokenSpaceGuid.PcdTest|{CODE({
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
  {0, {0, 0, 0, 0,  0, 0, 0}},
})}

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
bob.c.feng@intel.com
2018-11-07 17:18:34 +08:00
committed by BobCF
parent 088a533480
commit 72a1d77694
6 changed files with 645 additions and 339 deletions

View File

@ -820,221 +820,219 @@ class ValueExpressionEx(ValueExpression):
def __call__(self, RealValue=False, Depth=0): def __call__(self, RealValue=False, Depth=0):
PcdValue = self.PcdValue PcdValue = self.PcdValue
try: if "{CODE(" not in PcdValue:
PcdValue = ValueExpression.__call__(self, RealValue, Depth) try:
if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or PcdValue.startswith("L'")): PcdValue = ValueExpression.__call__(self, RealValue, Depth)
PcdValue, Size = ParseFieldValue(PcdValue) if self.PcdType == TAB_VOID and (PcdValue.startswith("'") or PcdValue.startswith("L'")):
PcdValueList = [] PcdValue, Size = ParseFieldValue(PcdValue)
for I in range(Size): PcdValueList = []
PcdValueList.append('0x%02X'%(PcdValue & 0xff)) for I in range(Size):
PcdValue = PcdValue >> 8 PcdValueList.append('0x%02X'%(PcdValue & 0xff))
PcdValue = '{' + ','.join(PcdValueList) + '}' PcdValue = PcdValue >> 8
elif self.PcdType in TAB_PCD_NUMERIC_TYPES and (PcdValue.startswith("'") or \ PcdValue = '{' + ','.join(PcdValueList) + '}'
PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')): elif self.PcdType in TAB_PCD_NUMERIC_TYPES and (PcdValue.startswith("'") or \
raise BadExpression PcdValue.startswith('"') or PcdValue.startswith("L'") or PcdValue.startswith('L"') or PcdValue.startswith('{')):
except WrnExpression as Value: raise BadExpression
PcdValue = Value.result except WrnExpression as Value:
except BadExpression as Value: PcdValue = Value.result
if self.PcdType in TAB_PCD_NUMERIC_TYPES: except BadExpression as Value:
PcdValue = PcdValue.strip() if self.PcdType in TAB_PCD_NUMERIC_TYPES:
if PcdValue.startswith('{') and PcdValue.endswith('}'): PcdValue = PcdValue.strip()
PcdValue = SplitPcdValueString(PcdValue[1:-1]) if PcdValue.startswith('{') and PcdValue.endswith('}'):
if ERR_STRING_CMP.split(':')[0] in Value.message: PcdValue = SplitPcdValueString(PcdValue[1:-1])
raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value)) if isinstance(PcdValue, type([])):
if isinstance(PcdValue, type([])): TmpValue = 0
TmpValue = 0 Size = 0
Size = 0 ValueType = ''
ValueType = '' for Item in PcdValue:
for Item in PcdValue:
Item = Item.strip()
if Item.startswith(TAB_UINT8):
ItemSize = 1
ValueType = TAB_UINT8
elif Item.startswith(TAB_UINT16):
ItemSize = 2
ValueType = TAB_UINT16
elif Item.startswith(TAB_UINT32):
ItemSize = 4
ValueType = TAB_UINT32
elif Item.startswith(TAB_UINT64):
ItemSize = 8
ValueType = TAB_UINT64
elif Item[0] in {'"', "'", 'L'}:
ItemSize = 0
ValueType = TAB_VOID
else:
ItemSize = 0
ValueType = TAB_UINT8
Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)
if ItemSize == 0:
try:
tmpValue = int(Item, 0)
if tmpValue > 255:
raise BadExpression("Byte array number %s should less than 0xFF." % Item)
except BadExpression as Value:
raise BadExpression(Value)
except ValueError:
pass
ItemValue, ItemSize = ParseFieldValue(Item)
else:
ItemValue = ParseFieldValue(Item)[0]
if isinstance(ItemValue, type('')):
ItemValue = int(ItemValue, 0)
TmpValue = (ItemValue << (Size * 8)) | TmpValue
Size = Size + ItemSize
else:
try:
TmpValue, Size = ParseFieldValue(PcdValue)
except BadExpression as Value:
raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))
if isinstance(TmpValue, type('')):
try:
TmpValue = int(TmpValue)
except:
raise BadExpression(Value)
else:
PcdValue = '0x%0{}X'.format(Size) % (TmpValue)
if TmpValue < 0:
raise BadExpression('Type %s PCD Value is negative' % self.PcdType)
if self.PcdType == TAB_UINT8 and Size > 1:
raise BadExpression('Type %s PCD Value Size is Larger than 1 byte' % self.PcdType)
if self.PcdType == TAB_UINT16 and Size > 2:
raise BadExpression('Type %s PCD Value Size is Larger than 2 byte' % self.PcdType)
if self.PcdType == TAB_UINT32 and Size > 4:
raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)
if self.PcdType == TAB_UINT64 and Size > 8:
raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)
else:
try:
TmpValue = int(PcdValue)
TmpList = []
if TmpValue.bit_length() == 0:
PcdValue = '{0x00}'
else:
for I in range((TmpValue.bit_length() + 7) / 8):
TmpList.append('0x%02x' % ((TmpValue >> I * 8) & 0xff))
PcdValue = '{' + ', '.join(TmpList) + '}'
except:
if PcdValue.strip().startswith('{'):
PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])
LabelDict = {}
NewPcdValueList = []
LabelOffset = 0
for Item in PcdValueList:
# compute byte offset of every LABEL
LabelList = _ReLabel.findall(Item)
Item = _ReLabel.sub('', Item)
Item = Item.strip() Item = Item.strip()
if LabelList:
for Label in LabelList:
if not IsValidCName(Label):
raise BadExpression('%s is not a valid c variable name' % Label)
if Label not in LabelDict:
LabelDict[Label] = str(LabelOffset)
if Item.startswith(TAB_UINT8): if Item.startswith(TAB_UINT8):
LabelOffset = LabelOffset + 1 ItemSize = 1
ValueType = TAB_UINT8
elif Item.startswith(TAB_UINT16): elif Item.startswith(TAB_UINT16):
LabelOffset = LabelOffset + 2 ItemSize = 2
ValueType = TAB_UINT16
elif Item.startswith(TAB_UINT32): elif Item.startswith(TAB_UINT32):
LabelOffset = LabelOffset + 4 ItemSize = 4
ValueType = TAB_UINT32
elif Item.startswith(TAB_UINT64): elif Item.startswith(TAB_UINT64):
LabelOffset = LabelOffset + 8 ItemSize = 8
ValueType = TAB_UINT64
elif Item[0] in {'"', "'", 'L'}:
ItemSize = 0
ValueType = TAB_VOID
else: else:
ItemSize = 0
ValueType = TAB_UINT8
Item = ValueExpressionEx(Item, ValueType, self._Symb)(True)
if ItemSize == 0:
try: try:
ItemValue, ItemSize = ParseFieldValue(Item) tmpValue = int(Item, 0)
LabelOffset = LabelOffset + ItemSize if tmpValue > 255:
except: raise BadExpression("Byte array number %s should less than 0xFF." % Item)
LabelOffset = LabelOffset + 1 except BadExpression as Value:
raise BadExpression(Value)
except ValueError:
pass
ItemValue, ItemSize = ParseFieldValue(Item)
else:
ItemValue = ParseFieldValue(Item)[0]
for Item in PcdValueList: if isinstance(ItemValue, type('')):
# for LABEL parse ItemValue = int(ItemValue, 0)
Item = Item.strip()
try: TmpValue = (ItemValue << (Size * 8)) | TmpValue
Size = Size + ItemSize
else:
try:
TmpValue, Size = ParseFieldValue(PcdValue)
except BadExpression as Value:
raise BadExpression("Type: %s, Value: %s, %s" % (self.PcdType, PcdValue, Value))
if isinstance(TmpValue, type('')):
try:
TmpValue = int(TmpValue)
except:
raise BadExpression(Value)
else:
PcdValue = '0x%0{}X'.format(Size) % (TmpValue)
if TmpValue < 0:
raise BadExpression('Type %s PCD Value is negative' % self.PcdType)
if self.PcdType == TAB_UINT8 and Size > 1:
raise BadExpression('Type %s PCD Value Size is Larger than 1 byte' % self.PcdType)
if self.PcdType == TAB_UINT16 and Size > 2:
raise BadExpression('Type %s PCD Value Size is Larger than 2 byte' % self.PcdType)
if self.PcdType == TAB_UINT32 and Size > 4:
raise BadExpression('Type %s PCD Value Size is Larger than 4 byte' % self.PcdType)
if self.PcdType == TAB_UINT64 and Size > 8:
raise BadExpression('Type %s PCD Value Size is Larger than 8 byte' % self.PcdType)
else:
try:
TmpValue = int(PcdValue)
TmpList = []
if TmpValue.bit_length() == 0:
PcdValue = '{0x00}'
else:
for I in range((TmpValue.bit_length() + 7) / 8):
TmpList.append('0x%02x' % ((TmpValue >> I * 8) & 0xff))
PcdValue = '{' + ', '.join(TmpList) + '}'
except:
if PcdValue.strip().startswith('{'):
PcdValueList = SplitPcdValueString(PcdValue.strip()[1:-1])
LabelDict = {}
NewPcdValueList = []
LabelOffset = 0
for Item in PcdValueList:
# compute byte offset of every LABEL
LabelList = _ReLabel.findall(Item)
Item = _ReLabel.sub('', Item) Item = _ReLabel.sub('', Item)
except: Item = Item.strip()
pass if LabelList:
try: for Label in LabelList:
OffsetList = _ReOffset.findall(Item) if not IsValidCName(Label):
except: raise BadExpression('%s is not a valid c variable name' % Label)
pass if Label not in LabelDict:
# replace each offset, except errors LabelDict[Label] = str(LabelOffset)
for Offset in OffsetList: if Item.startswith(TAB_UINT8):
try: LabelOffset = LabelOffset + 1
Item = Item.replace('OFFSET_OF({})'.format(Offset), LabelDict[Offset]) elif Item.startswith(TAB_UINT16):
except: LabelOffset = LabelOffset + 2
raise BadExpression('%s not defined' % Offset) elif Item.startswith(TAB_UINT32):
LabelOffset = LabelOffset + 4
elif Item.startswith(TAB_UINT64):
LabelOffset = LabelOffset + 8
else:
try:
ItemValue, ItemSize = ParseFieldValue(Item)
LabelOffset = LabelOffset + ItemSize
except:
LabelOffset = LabelOffset + 1
NewPcdValueList.append(Item) for Item in PcdValueList:
# for LABEL parse
AllPcdValueList = [] Item = Item.strip()
for Item in NewPcdValueList:
Size = 0
ValueStr = ''
TokenSpaceGuidName = ''
if Item.startswith(TAB_GUID) and Item.endswith(')'):
try: try:
TokenSpaceGuidName = re.search('GUID\((\w+)\)', Item).group(1) Item = _ReLabel.sub('', Item)
except: except:
pass pass
if TokenSpaceGuidName and TokenSpaceGuidName in self._Symb: try:
Item = 'GUID(' + self._Symb[TokenSpaceGuidName] + ')' OffsetList = _ReOffset.findall(Item)
elif TokenSpaceGuidName: except:
raise BadExpression('%s not found in DEC file' % TokenSpaceGuidName) pass
Item, Size = ParseFieldValue(Item) # replace each offset, except errors
for Index in range(0, Size): for Offset in OffsetList:
ValueStr = '0x%02X' % (int(Item) & 255) try:
Item >>= 8 Item = Item.replace('OFFSET_OF({})'.format(Offset), LabelDict[Offset])
AllPcdValueList.append(ValueStr) except:
continue raise BadExpression('%s not defined' % Offset)
elif Item.startswith('DEVICE_PATH') and Item.endswith(')'):
Item, Size = ParseFieldValue(Item)
AllPcdValueList.append(Item[1:-1])
continue
else:
ValueType = ""
if Item.startswith(TAB_UINT8):
ItemSize = 1
ValueType = TAB_UINT8
elif Item.startswith(TAB_UINT16):
ItemSize = 2
ValueType = TAB_UINT16
elif Item.startswith(TAB_UINT32):
ItemSize = 4
ValueType = TAB_UINT32
elif Item.startswith(TAB_UINT64):
ItemSize = 8
ValueType = TAB_UINT64
else:
ItemSize = 0
if ValueType:
TmpValue = ValueExpressionEx(Item, ValueType, self._Symb)(True)
else:
TmpValue = ValueExpressionEx(Item, self.PcdType, self._Symb)(True)
Item = '0x%x' % TmpValue if not isinstance(TmpValue, type('')) else TmpValue
if ItemSize == 0:
ItemValue, ItemSize = ParseFieldValue(Item)
if Item[0] not in {'"', 'L', '{'} and ItemSize > 1:
raise BadExpression("Byte array number %s should less than 0xFF." % Item)
else:
ItemValue = ParseFieldValue(Item)[0]
for I in range(0, ItemSize):
ValueStr = '0x%02X' % (int(ItemValue) & 255)
ItemValue >>= 8
AllPcdValueList.append(ValueStr)
Size += ItemSize
if Size > 0: NewPcdValueList.append(Item)
PcdValue = '{' + ','.join(AllPcdValueList) + '}'
else:
raise BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))
if PcdValue == 'True': AllPcdValueList = []
PcdValue = '1' for Item in NewPcdValueList:
if PcdValue == 'False': Size = 0
PcdValue = '0' ValueStr = ''
TokenSpaceGuidName = ''
if Item.startswith(TAB_GUID) and Item.endswith(')'):
try:
TokenSpaceGuidName = re.search('GUID\((\w+)\)', Item).group(1)
except:
pass
if TokenSpaceGuidName and TokenSpaceGuidName in self._Symb:
Item = 'GUID(' + self._Symb[TokenSpaceGuidName] + ')'
elif TokenSpaceGuidName:
raise BadExpression('%s not found in DEC file' % TokenSpaceGuidName)
Item, Size = ParseFieldValue(Item)
for Index in range(0, Size):
ValueStr = '0x%02X' % (int(Item) & 255)
Item >>= 8
AllPcdValueList.append(ValueStr)
continue
elif Item.startswith('DEVICE_PATH') and Item.endswith(')'):
Item, Size = ParseFieldValue(Item)
AllPcdValueList.append(Item[1:-1])
continue
else:
ValueType = ""
if Item.startswith(TAB_UINT8):
ItemSize = 1
ValueType = TAB_UINT8
elif Item.startswith(TAB_UINT16):
ItemSize = 2
ValueType = TAB_UINT16
elif Item.startswith(TAB_UINT32):
ItemSize = 4
ValueType = TAB_UINT32
elif Item.startswith(TAB_UINT64):
ItemSize = 8
ValueType = TAB_UINT64
else:
ItemSize = 0
if ValueType:
TmpValue = ValueExpressionEx(Item, ValueType, self._Symb)(True)
else:
TmpValue = ValueExpressionEx(Item, self.PcdType, self._Symb)(True)
Item = '0x%x' % TmpValue if not isinstance(TmpValue, type('')) else TmpValue
if ItemSize == 0:
ItemValue, ItemSize = ParseFieldValue(Item)
if Item[0] not in {'"', 'L', '{'} and ItemSize > 1:
raise BadExpression("Byte array number %s should less than 0xFF." % Item)
else:
ItemValue = ParseFieldValue(Item)[0]
for I in range(0, ItemSize):
ValueStr = '0x%02X' % (int(ItemValue) & 255)
ItemValue >>= 8
AllPcdValueList.append(ValueStr)
Size += ItemSize
if Size > 0:
PcdValue = '{' + ','.join(AllPcdValueList) + '}'
else:
raise BadExpression("Type: %s, Value: %s, %s"%(self.PcdType, PcdValue, Value))
if PcdValue == 'True':
PcdValue = '1'
if PcdValue == 'False':
PcdValue = '0'
if RealValue: if RealValue:
return PcdValue return PcdValue

View File

@ -1297,6 +1297,8 @@ def ParseDevPathValue (Value):
return '{' + out + '}', Size return '{' + out + '}', Size
def ParseFieldValue (Value): def ParseFieldValue (Value):
if "{CODE(" in Value:
return Value, len(Value.split(","))
if isinstance(Value, type(0)): if isinstance(Value, type(0)):
return Value, (Value.bit_length() + 7) / 8 return Value, (Value.bit_length() + 7) / 8
if not isinstance(Value, type('')): if not isinstance(Value, type('')):

View File

@ -50,7 +50,7 @@ class PcdClassObject(object):
self.TokenSpaceGuidCName = Guid self.TokenSpaceGuidCName = Guid
self.TokenSpaceGuidValue = GuidValue self.TokenSpaceGuidValue = GuidValue
self.Type = Type self.Type = Type
self.DatumType = DatumType self._DatumType = DatumType
self.DefaultValue = Value self.DefaultValue = Value
self.TokenValue = Token self.TokenValue = Token
self.MaxDatumSize = MaxDatumSize self.MaxDatumSize = MaxDatumSize
@ -72,6 +72,63 @@ class PcdClassObject(object):
self.PcdValueFromFdf = "" self.PcdValueFromFdf = ""
self.CustomAttribute = {} self.CustomAttribute = {}
self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag
self._Capacity = None
@property
def Capacity(self):
self._Capacity = []
dimension = ArrayIndex.findall(self._DatumType)
for item in dimension:
maxsize = item.lstrip("[").rstrip("]").strip()
if not maxsize:
maxsize = "-1"
self._Capacity.append(maxsize)
if hasattr(self, "SkuOverrideValues"):
for sku in self.SkuOverrideValues:
for defaultstore in self.SkuOverrideValues[sku]:
fields = self.SkuOverrideValues[sku][defaultstore]
for demesionattr in fields:
deme = ArrayIndex.findall(demesionattr)
for i in range(len(deme)-1):
if int(deme[i].lstrip("[").rstrip("]").strip()) > int(self._Capacity[i]):
print "error"
if hasattr(self,"DefaultValues"):
for demesionattr in self.DefaultValues:
deme = ArrayIndex.findall(demesionattr)
for i in range(len(deme)-1):
if int(deme[i].lstrip("[").rstrip("]").strip()) > int(self._Capacity[i]):
print "error"
self._Capacity = [str(int(d) + 1) for d in self._Capacity]
return self._Capacity
@property
def DatumType(self):
return self._DatumType
@DatumType.setter
def DatumType(self,DataType):
self._DatumType = DataType
self._Capacity = None
@property
def BaseDatumType(self):
if self.IsArray():
return self._DatumType[:self._DatumType.index("[")]
else:
return self._DatumType
def IsArray(self):
return True if len(self.Capacity) else False
def IsAggregateDatumType(self):
if self.DatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:
return False
if self.IsArray() or StructPattern.match(self.DatumType):
return True
return False
def IsSimpleTypeArray(self):
if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, "BOOLEAN"]:
return True
return False
@staticmethod @staticmethod
def GetPcdMaxSizeWorker(PcdString, MaxSize): def GetPcdMaxSizeWorker(PcdString, MaxSize):
@ -183,23 +240,27 @@ class StructurePcd(PcdClassObject):
def __repr__(self): def __repr__(self):
return self.TypeName return self.TypeName
def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0): def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0,DimensionAttr ="-1"):
if FieldName in self.DefaultValues: if DimensionAttr not in self.DefaultValues:
del self.DefaultValues[FieldName] self.DefaultValues[DimensionAttr] = collections.OrderedDict()
self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo] if FieldName in self.DefaultValues[DimensionAttr]:
return self.DefaultValues[FieldName] del self.DefaultValues[DimensionAttr][FieldName]
self.DefaultValues[DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]
return self.DefaultValues[DimensionAttr][FieldName]
def SetDecDefaultValue(self, DefaultValue): def SetDecDefaultValue(self, DefaultValue):
self.DefaultValueFromDec = DefaultValue self.DefaultValueFromDec = DefaultValue
def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0): def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0, DimensionAttr = '-1'):
if SkuName not in self.SkuOverrideValues: if SkuName not in self.SkuOverrideValues:
self.SkuOverrideValues[SkuName] = OrderedDict() self.SkuOverrideValues[SkuName] = OrderedDict()
if DefaultStoreName not in self.SkuOverrideValues[SkuName]: if DefaultStoreName not in self.SkuOverrideValues[SkuName]:
self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict() self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict()
if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]: if DimensionAttr not in self.SkuOverrideValues[SkuName][DefaultStoreName]:
del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr] = collections.OrderedDict()
self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo] if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]:
return self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName][DimensionAttr]
self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo]
return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName]
def SetPcdMode (self, PcdMode): def SetPcdMode (self, PcdMode):
self.PcdMode = PcdMode self.PcdMode = PcdMode
@ -209,7 +270,7 @@ class StructurePcd(PcdClassObject):
self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName
self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue
self.Type = PcdObject.Type if PcdObject.Type else self.Type self.Type = PcdObject.Type if PcdObject.Type else self.Type
self.DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType self._DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType
self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue else self.DefaultValue self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue else self.DefaultValue
self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue
self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize

View File

@ -361,6 +361,21 @@ class DecBuildData(PackageBuildClassObject):
self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX)) self._Pcds.update(self._GetPcd(MODEL_PCD_DYNAMIC_EX))
return self._Pcds return self._Pcds
def ParsePcdName(self,TokenCName):
TokenCName = TokenCName.strip()
if TokenCName.startswith("["):
if "." in TokenCName:
Demesionattr = TokenCName[:TokenCName.index(".")]
Fields = TokenCName[TokenCName.index(".")+1:]
else:
Demesionattr = TokenCName
Fields = ""
else:
Demesionattr = ""
Fields = TokenCName
return Demesionattr,Fields
def ProcessStructurePcd(self, StructurePcdRawDataSet): def ProcessStructurePcd(self, StructurePcdRawDataSet):
s_pcd_set = OrderedDict() s_pcd_set = OrderedDict()
for s_pcd, LineNo in StructurePcdRawDataSet: for s_pcd, LineNo in StructurePcdRawDataSet:
@ -373,6 +388,8 @@ class DecBuildData(PackageBuildClassObject):
dep_pkgs = [] dep_pkgs = []
struct_pcd = StructurePcd() struct_pcd = StructurePcd()
for item, LineNo in s_pcd_set[pcdname]: for item, LineNo in s_pcd_set[pcdname]:
if not item.TokenCName:
continue
if "<HeaderFiles>" in item.TokenCName: if "<HeaderFiles>" in item.TokenCName:
struct_pcd.StructuredPcdIncludeFile.append(item.DefaultValue) struct_pcd.StructuredPcdIncludeFile.append(item.DefaultValue)
elif "<Packages>" in item.TokenCName: elif "<Packages>" in item.TokenCName:
@ -385,7 +402,8 @@ class DecBuildData(PackageBuildClassObject):
struct_pcd.PkgPath = self.MetaFile.File struct_pcd.PkgPath = self.MetaFile.File
struct_pcd.SetDecDefaultValue(item.DefaultValue) struct_pcd.SetDecDefaultValue(item.DefaultValue)
else: else:
struct_pcd.AddDefaultValue(item.TokenCName, item.DefaultValue, self.MetaFile.File, LineNo) DemesionAttr, Fields = self.ParsePcdName(item.TokenCName)
struct_pcd.AddDefaultValue(Fields, item.DefaultValue, self.MetaFile.File, LineNo,DemesionAttr)
struct_pcd.PackageDecs = dep_pkgs struct_pcd.PackageDecs = dep_pkgs
str_pcd_set.append(struct_pcd) str_pcd_set.append(struct_pcd)
@ -446,15 +464,12 @@ class DecBuildData(PackageBuildClassObject):
StructurePcds = self.ProcessStructurePcd(StrPcdSet) StructurePcds = self.ProcessStructurePcd(StrPcdSet)
for pcd in StructurePcds: for pcd in StructurePcds:
Pcds[pcd.TokenCName, pcd.TokenSpaceGuidCName, self._PCD_TYPE_STRING_[Type]] = pcd Pcds[pcd.TokenCName, pcd.TokenSpaceGuidCName, self._PCD_TYPE_STRING_[Type]] = pcd
StructPattern = re.compile(r'[_a-zA-Z][0-9A-Za-z_]*$')
for pcd in Pcds.values(): for pcd in Pcds.values():
if pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]: if pcd.DatumType not in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]:
if StructPattern.match(pcd.DatumType) is None: if not pcd.IsAggregateDatumType():
EdkLogger.error('build', FORMAT_INVALID, "DatumType only support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct name.", DefinitionPosition[pcd][0], DefinitionPosition[pcd][1]) EdkLogger.error('build', FORMAT_INVALID, "DatumType only support BOOLEAN, UINT8, UINT16, UINT32, UINT64, VOID* or a valid struct name.", DefinitionPosition[pcd][0], DefinitionPosition[pcd][1])
for struct_pcd in Pcds.values(): elif not pcd.IsArray() and not pcd.StructuredPcdIncludeFile:
if isinstance(struct_pcd, StructurePcd) and not struct_pcd.StructuredPcdIncludeFile: EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The structure Pcd %s.%s header file is not found in %s line %s \n" % (pcd.TokenSpaceGuidCName, pcd.TokenCName, pcd.DefinitionPosition[0], pcd.DefinitionPosition[1] ))
EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "The structure Pcd %s.%s header file is not found in %s line %s \n" % (struct_pcd.TokenSpaceGuidCName, struct_pcd.TokenCName, DefinitionPosition[struct_pcd][0], DefinitionPosition[struct_pcd][1] ))
return Pcds return Pcds
@property @property

View File

@ -42,6 +42,7 @@ import subprocess
from Common.Misc import SaveFileOnChange from Common.Misc import SaveFileOnChange
from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject
from collections import OrderedDict, defaultdict from collections import OrderedDict, defaultdict
from .BuildClassObject import ArrayIndex
PcdValueInitName = 'PcdValueInit' PcdValueInitName = 'PcdValueInit'
@ -912,25 +913,26 @@ class DscBuildData(PlatformBuildClassObject):
ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting)) ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))
if ValueList[Index]: if ValueList[Index]:
DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType
try: if "{CODE(" not in ValueList[Index]:
ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True) try:
except BadExpression as Value: ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)
EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo, except BadExpression as Value:
ExtraData="PCD [%s.%s] Value \"%s\" " % ( EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,
TokenSpaceGuid, PcdCName, ValueList[Index])) ExtraData="PCD [%s.%s] Value \"%s\" " % (
except EvaluationException as Excpt: TokenSpaceGuid, PcdCName, ValueList[Index]))
if hasattr(Excpt, 'Pcd'): except EvaluationException as Excpt:
if Excpt.Pcd in GlobalData.gPlatformOtherPcds: if hasattr(Excpt, 'Pcd'):
EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as" if Excpt.Pcd in GlobalData.gPlatformOtherPcds:
" it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section" EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"
" of the DSC file" % Excpt.Pcd, " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
File=self.MetaFile, Line=LineNo) " of the DSC file" % Excpt.Pcd,
File=self.MetaFile, Line=LineNo)
else:
EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,
File=self.MetaFile, Line=LineNo)
else: else:
EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd, EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),
File=self.MetaFile, Line=LineNo) File=self.MetaFile, Line=LineNo)
else:
EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),
File=self.MetaFile, Line=LineNo)
if ValueList[Index]: if ValueList[Index]:
Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index]) Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])
@ -1395,6 +1397,26 @@ class DscBuildData(PlatformBuildClassObject):
self.Pcds[Name, Guid].DefaultValue = Value self.Pcds[Name, Guid].DefaultValue = Value
return AllPcds return AllPcds
def ParsePcdNameStruct(self,NamePart1,NamePart2):
TokenSpaceCName = PcdCName = DimensionAttr = Field = ""
if "." in NamePart1:
TokenSpaceCName, TempPcdCName = NamePart1.split(".")
if "[" in TempPcdCName:
PcdCName = TempPcdCName[:TempPcdCName.index("[")]
DimensionAttr = TempPcdCName[TempPcdCName.index("["):]
else:
PcdCName = TempPcdCName
Field = NamePart2
else:
TokenSpaceCName = NamePart1
if "[" in NamePart2:
PcdCName = NamePart2[:NamePart2.index("[")]
DimensionAttr = NamePart2[NamePart2.index("["):]
else:
PcdCName = NamePart2
return TokenSpaceCName,PcdCName,DimensionAttr,Field
def UpdateStructuredPcds(self, TypeList, AllPcds): def UpdateStructuredPcds(self, TypeList, AllPcds):
DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT], DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],
@ -1424,9 +1446,19 @@ class DscBuildData(PlatformBuildClassObject):
SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName
if SkuName not in SkuIds: if SkuName not in SkuIds:
continue continue
TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)
pcd_in_dec = self._DecPcds.get((PCName,TCName), None)
if pcd_in_dec is None:
EdkLogger.error('build', PARSER_ERROR,
"Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),
File=self.MetaFile, Line = Dummy5)
if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in PcdCName):
if not isinstance (pcd_in_dec, StructurePcd):
EdkLogger.error('build', PARSER_ERROR,
"Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),
File=self.MetaFile, Line = Dummy5)
if SkuName in SkuIds and "." in TokenSpaceGuid: S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])
S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])
# handle pcd value override # handle pcd value override
StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet) StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)
@ -1434,27 +1466,19 @@ class DscBuildData(PlatformBuildClassObject):
for str_pcd in StrPcdSet: for str_pcd in StrPcdSet:
str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None) str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)
str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None) str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)
if not isinstance (str_pcd_dec, StructurePcd): str_pcd_obj_str = StructurePcd()
EdkLogger.error('build', PARSER_ERROR, str_pcd_obj_str.copy(str_pcd_dec)
"Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch), if str_pcd_obj:
File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5]) str_pcd_obj_str.copy(str_pcd_obj)
if str_pcd_dec: if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
str_pcd_obj_str = StructurePcd() str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}
str_pcd_obj_str.copy(str_pcd_dec) else:
if str_pcd_obj: str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}
str_pcd_obj_str.copy(str_pcd_obj) for str_pcd_data in StrPcdSet[str_pcd]:
if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]: if str_pcd_data[4] in SkuIds:
str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList} str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])
else: S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str
str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}
for str_pcd_data in StrPcdSet[str_pcd]:
if str_pcd_data[3] in SkuIds:
str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), TAB_DEFAULT if str_pcd_data[3] == TAB_COMMON else str_pcd_data[3], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[5])
S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str
else:
EdkLogger.error('build', PARSER_ERROR,
"Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),
File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])
# Add the Structure PCD that only defined in DEC, don't have override in DSC file # Add the Structure PCD that only defined in DEC, don't have override in DSC file
for Pcd in self.DecPcds: for Pcd in self.DecPcds:
if isinstance(self._DecPcds[Pcd], StructurePcd): if isinstance(self._DecPcds[Pcd], StructurePcd):
@ -1590,9 +1614,10 @@ class DscBuildData(PlatformBuildClassObject):
if SkuName not in AvailableSkuIdSet: if SkuName not in AvailableSkuIdSet:
EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName, EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
File=self.MetaFile, Line=Dummy5) File=self.MetaFile, Line=Dummy5)
if "." not in TokenSpaceGuid: if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) if "." not in TokenSpaceGuid and "[" not in PcdCName:
PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))
PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting
for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet: for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:
Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName] Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]
@ -1688,7 +1713,20 @@ class DscBuildData(PlatformBuildClassObject):
def GenerateSizeFunction(self, Pcd): def GenerateSizeFunction(self, Pcd):
CApp = "// Default Value in Dec \n" CApp = "// Default Value in Dec \n"
CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
for FieldList in [Pcd.DefaultValues]: if Pcd.IsArray():
if (len(Pcd.Capacity) == 1 and Pcd.Capacity[0] != '0') or (len(Pcd.Capacity) >1 and reduce(lambda x,y:int(x)*int(y), Pcd.Capacity)) > 0:
CApp += " *Size = (sizeof (%s) * (%s) > *Size) ? sizeof (%s) * (%s): *Size; \n" % (Pcd.BaseDatumType, "*".join(Pcd.Capacity),Pcd.BaseDatumType, "*".join(Pcd.Capacity))
if "{CODE(" in Pcd.DefaultValueFromDec:
CApp += " *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)
for skuname in Pcd.SkuInfoList:
skuobj = Pcd.SkuInfoList[skuname]
if skuobj.VariableName:
for defaultstore in skuobj.DefaultStoreDict:
CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)
else:
CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)
for index in Pcd.DefaultValues:
FieldList = Pcd.DefaultValues[index]
if not FieldList: if not FieldList:
continue continue
for FieldName in FieldList: for FieldName in FieldList:
@ -1718,31 +1756,32 @@ class DscBuildData(PlatformBuildClassObject):
continue continue
for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]: for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:
CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem) CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)
for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]: for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:
if not FieldList: for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:
continue if not FieldList:
for FieldName in FieldList: continue
FieldName = "." + FieldName for FieldName in FieldList:
IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0]) FieldName = "." + FieldName
if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')): IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])
try: if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):
Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True) try:
except BadExpression: Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % except BadExpression:
(".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2])) EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %
Value, ValueSize = ParseFieldValue(Value) (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]); Value, ValueSize = ParseFieldValue(Value)
else: CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);
NewFieldName = '' else:
FieldName_ori = FieldName.strip('.') NewFieldName = ''
while '[' in FieldName: FieldName_ori = FieldName.strip('.')
NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]' while '[' in FieldName:
ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0]) NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
FieldName = FieldName.split(']', 1)[1] ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
FieldName = NewFieldName + FieldName FieldName = FieldName.split(']', 1)[1]
while '[' in FieldName: FieldName = NewFieldName + FieldName
FieldName = FieldName.rsplit('[', 1)[0] while '[' in FieldName:
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0]) FieldName = FieldName.rsplit('[', 1)[0]
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])
if Pcd.PcdFieldValueFromFdf: if Pcd.PcdFieldValueFromFdf:
CApp = CApp + "// From fdf \n" CApp = CApp + "// From fdf \n"
for FieldName in Pcd.PcdFieldValueFromFdf: for FieldName in Pcd.PcdFieldValueFromFdf:
@ -1791,19 +1830,64 @@ class DscBuildData(PlatformBuildClassObject):
while '[' in FieldName: while '[' in FieldName:
FieldName = FieldName.rsplit('[', 1)[0] FieldName = FieldName.rsplit('[', 1)[0]
CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0]) CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])
CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize()) if Pcd.GetPcdMaxSize():
CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())
CApp = CApp + "}\n" CApp = CApp + "}\n"
return CApp return CApp
@staticmethod @staticmethod
def GenerateSizeStatments(Pcd): def GenerateSizeStatments(Pcd):
CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType) if Pcd.IsArray():
r_datatype = [Pcd.BaseDatumType]
for dem in Pcd.Capacity:
if dem == '0':
r_datatype.append("[1]")
else:
r_datatype.append("[" + dem + "]")
CApp = ' Size = sizeof(%s);\n' % ("".join(r_datatype))
else:
CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)
CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
return CApp return CApp
def GetIndicator(self,index,FieldName,Pcd):
def cleanupindex(indexstr):
return indexstr.strip("[").strip("]").strip()
index_elements = ArrayIndex.findall(index)
pcd_capacity = Pcd.Capacity
if index:
indicator = "(Pcd"
if len(pcd_capacity)>2:
for i in xrange(0,len(index_elements)):
index_ele = index_elements[i]
index_num = index_ele.strip("[").strip("]").strip()
if i == len(index_elements) -2:
indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i]))
break
else:
indicator += " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]))
elif len(pcd_capacity) == 2:
indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capacity[0]), index_elements[1].strip("[").strip("]").strip())
elif len(pcd_capacity) == 1:
index_ele = index_elements[0]
index_num = index_ele.strip("[").strip("]").strip()
indicator += " + %s)" % (index_num)
else:
indicator = "Pcd"
if FieldName:
indicator += "->" + FieldName
return indicator
def GetStarNum(self,Pcd):
if not Pcd.IsArray():
return 1
elif Pcd.IsSimpleTypeArray():
return len(Pcd.Capacity)
else:
return len(Pcd.Capacity) + 1
def GenerateDefaultValueAssignFunction(self, Pcd): def GenerateDefaultValueAssignFunction(self, Pcd):
CApp = "// Default value in Dec \n" CApp = "// Default value in Dec \n"
CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType) CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)
CApp = CApp + ' UINT32 FieldSize;\n' CApp = CApp + ' UINT32 FieldSize;\n'
CApp = CApp + ' CHAR8 *Value;\n' CApp = CApp + ' CHAR8 *Value;\n'
DefaultValueFromDec = Pcd.DefaultValueFromDec DefaultValueFromDec = Pcd.DefaultValueFromDec
@ -1822,9 +1906,13 @@ class DscBuildData(PlatformBuildClassObject):
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
# #
CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec) if "{CODE(" in Pcd.DefaultValueFromDec:
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) CApp = CApp + ' memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
for FieldList in [Pcd.DefaultValues]: else:
CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
for index in Pcd.DefaultValues:
FieldList = Pcd.DefaultValues[index]
if not FieldList: if not FieldList:
continue continue
for FieldName in FieldList: for FieldName in FieldList:
@ -1840,8 +1928,10 @@ class DscBuildData(PlatformBuildClassObject):
Value, ValueSize = ParseFieldValue (FieldList[FieldName][0]) Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])
except Exception: except Exception:
EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2])) EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))
indicator = self.GetIndicator(index, FieldName,Pcd)
if isinstance(Value, str): if isinstance(Value, str):
CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
elif IsArray: elif IsArray:
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
@ -1850,14 +1940,16 @@ class DscBuildData(PlatformBuildClassObject):
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)
else: else:
if '[' in FieldName and ']' in FieldName: if '[' in FieldName and ']' in FieldName:
Index = int(FieldName.split('[')[1].split(']')[0]) Index = int(FieldName.split('[')[1].split(']')[0])
CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName) CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)
if ValueSize > 4: if ValueSize > 4:
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
else: else:
CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + "}\n" CApp = CApp + "}\n"
return CApp return CApp
@ -1868,7 +1960,7 @@ class DscBuildData(PlatformBuildClassObject):
def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName): def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):
CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName) CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)
CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType) CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)
CApp = CApp + ' UINT32 FieldSize;\n' CApp = CApp + ' UINT32 FieldSize;\n'
CApp = CApp + ' CHAR8 *Value;\n' CApp = CApp + ' CHAR8 *Value;\n'
@ -1881,40 +1973,60 @@ class DscBuildData(PlatformBuildClassObject):
pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName) pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)
else: else:
pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT) pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)
for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:
if not FieldList: if pcddefaultvalue:
continue FieldList = pcddefaultvalue
if pcddefaultvalue and FieldList == pcddefaultvalue: IsArray = IsFieldValueAnArray(FieldList)
IsArray = IsFieldValueAnArray(FieldList) if IsArray:
if IsArray: if "{CODE(" not in FieldList:
try: try:
FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True) FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)
except BadExpression: except BadExpression:
EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" % EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %
(Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList)) (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))
Value, ValueSize = ParseFieldValue (FieldList) Value, ValueSize = ParseFieldValue (FieldList)
if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT): if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):
if isinstance(Value, str): if isinstance(Value, str):
if "{CODE(" in Value:
CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)
else:
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue) CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)
elif IsArray: elif IsArray:
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
# #
if Pcd.IsArray():
CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)
else:
CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue) CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
else: else:
if isinstance(Value, str): if isinstance(Value, str):
if "{CODE(" in Value:
CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)
else:
CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)) CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))
elif IsArray: elif IsArray:
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
# #
if Pcd.IsArray():
CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)
else:
CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)) CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))
CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize) CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
inheritvalue = inherit_OverrideValues.get(DefaultStoreName)
if not inheritvalue:
inheritvalue = []
for index in inheritvalue:
FieldList = inheritvalue[index]
if not FieldList:
continue continue
if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )): if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):
for FieldName in FieldList: for FieldName in FieldList:
indicator = self.GetIndicator(index, FieldName,Pcd)
IsArray = IsFieldValueAnArray(FieldList[FieldName][0]) IsArray = IsFieldValueAnArray(FieldList[FieldName][0])
if IsArray: if IsArray:
try: try:
@ -1932,18 +2044,19 @@ class DscBuildData(PlatformBuildClassObject):
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
# #
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName) CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)
else: else:
if '[' in FieldName and ']' in FieldName: if '[' in FieldName and ']' in FieldName:
Index = int(FieldName.split('[')[1].split(']')[0]) Index = int(FieldName.split('[')[1].split(']')[0])
CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName) CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)
if ValueSize > 4: if ValueSize > 4:
CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
else: else:
CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + "}\n" CApp = CApp + "}\n"
return CApp return CApp
@ -1954,7 +2067,7 @@ class DscBuildData(PlatformBuildClassObject):
def GenerateCommandLineValue(self, Pcd): def GenerateCommandLineValue(self, Pcd):
CApp = "// Value in CommandLine\n" CApp = "// Value in CommandLine\n"
CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType) CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)
CApp = CApp + ' UINT32 FieldSize;\n' CApp = CApp + ' UINT32 FieldSize;\n'
CApp = CApp + ' CHAR8 *Value;\n' CApp = CApp + ' CHAR8 *Value;\n'
@ -2001,7 +2114,7 @@ class DscBuildData(PlatformBuildClassObject):
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
# #
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName) CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
@ -2022,7 +2135,7 @@ class DscBuildData(PlatformBuildClassObject):
return CApp return CApp
def GenerateFdfValue(self,Pcd): def GenerateFdfValue(self,Pcd):
CApp = "// Value in Fdf\n" CApp = "// Value in Fdf\n"
CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType) CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)
CApp = CApp + ' UINT32 FieldSize;\n' CApp = CApp + ' UINT32 FieldSize;\n'
CApp = CApp + ' CHAR8 *Value;\n' CApp = CApp + ' CHAR8 *Value;\n'
@ -2069,7 +2182,7 @@ class DscBuildData(PlatformBuildClassObject):
# #
# Use memcpy() to copy value into field # Use memcpy() to copy value into field
# #
CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName) CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)
CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0]) CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName, ValueSize, Pcd.DatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize) CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
@ -2090,7 +2203,7 @@ class DscBuildData(PlatformBuildClassObject):
return CApp return CApp
def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp): def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):
OverrideValues = {DefaultStore:""} OverrideValues = {DefaultStore:{}}
if Pcd.SkuOverrideValues: if Pcd.SkuOverrideValues:
OverrideValues = Pcd.SkuOverrideValues[SkuName] OverrideValues = Pcd.SkuOverrideValues[SkuName]
if not OverrideValues: if not OverrideValues:
@ -2106,16 +2219,14 @@ class DscBuildData(PlatformBuildClassObject):
CApp = CApp + ' CHAR8 *Value;\n' CApp = CApp + ' CHAR8 *Value;\n'
CApp = CApp + ' UINT32 OriginalSize;\n' CApp = CApp + ' UINT32 OriginalSize;\n'
CApp = CApp + ' VOID *OriginalPcd;\n' CApp = CApp + ' VOID *OriginalPcd;\n'
CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)
CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)
CApp = CApp + '\n' CApp = CApp + '\n'
if SkuName in Pcd.SkuInfoList: PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())
DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue)
else:
DefaultValue = Pcd.DefaultValue
PcdDefaultValue = StringToArray(DefaultValue.strip())
InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue) InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType, PcdDefaultValue)
# #
# Get current PCD value and size # Get current PCD value and size
@ -2138,7 +2249,7 @@ class DscBuildData(PlatformBuildClassObject):
# Always keep that larger one as the current size # Always keep that larger one as the current size
# #
CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n' CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType) CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)
CApp = CApp + ' memset (Pcd, 0, Size);\n' CApp = CApp + ' memset (Pcd, 0, Size);\n'
# #
@ -2167,7 +2278,7 @@ class DscBuildData(PlatformBuildClassObject):
# #
# Set new PCD value and size # Set new PCD value and size
# #
CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName) CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
# #
# Free PCD # Free PCD
@ -2176,6 +2287,39 @@ class DscBuildData(PlatformBuildClassObject):
CApp = CApp + '}\n' CApp = CApp + '}\n'
CApp = CApp + '\n' CApp = CApp + '\n'
return InitByteValue, CApp return InitByteValue, CApp
def GenerateArrayAssignment(self, Pcd):
CApp = ""
if not Pcd:
return CApp
if not Pcd.IsArray():
return CApp
Demesion = ""
for d in Pcd.Capacity:
if d == "0":
Demesion += "[]"
else:
Demesion += "["+d+"]"
Value = Pcd.DefaultValueFromDec
if "{CODE(" in Pcd.DefaultValueFromDec:
realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"
CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)
for skuname in Pcd.SkuInfoList:
skuinfo = Pcd.SkuInfoList[skuname]
if skuinfo.VariableName:
for defaultstore in skuinfo.DefaultStoreDict:
Value = skuinfo[defaultstore]
if "{CODE(" in Value:
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)
else:
Value = skuinfo.DefaultValue
if "{CODE(" in Value:
realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"
CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)
return CApp
def SkuOverrideValuesEmpty(self,OverrideValues): def SkuOverrideValuesEmpty(self,OverrideValues):
if not OverrideValues: if not OverrideValues:
return True return True
@ -2215,6 +2359,8 @@ class DscBuildData(PlatformBuildClassObject):
IncludeFiles.add(IncludeFile) IncludeFiles.add(IncludeFile)
CApp = CApp + '#include <%s>\n' % (IncludeFile) CApp = CApp + '#include <%s>\n' % (IncludeFile)
CApp = CApp + '\n' CApp = CApp + '\n'
for Pcd in StructuredPcds.values():
CApp = CApp + self.GenerateArrayAssignment(Pcd)
for PcdName in StructuredPcds: for PcdName in StructuredPcds:
Pcd = StructuredPcds[PcdName] Pcd = StructuredPcds[PcdName]
CApp = CApp + self.GenerateSizeFunction(Pcd) CApp = CApp + self.GenerateSizeFunction(Pcd)
@ -2395,6 +2541,8 @@ class DscBuildData(PlatformBuildClassObject):
FileLine = FileInfo [1].split (')')[0] FileLine = FileInfo [1].split (')')[0]
else: else:
FileInfo = Message.strip().split(':') FileInfo = Message.strip().split(':')
if len(FileInfo) < 2:
continue
FileName = FileInfo [0] FileName = FileInfo [0]
FileLine = FileInfo [1] FileLine = FileInfo [1]
if FileLine.isdigit(): if FileLine.isdigit():
@ -2478,7 +2626,7 @@ class DscBuildData(PlatformBuildClassObject):
if SkuName not in AvailableSkuIdSet: if SkuName not in AvailableSkuIdSet:
EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName, EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
File=self.MetaFile, Line=Dummy5) File=self.MetaFile, Line=Dummy5)
if "." not in TokenSpaceGuid: if "." not in TokenSpaceGuid and "[" not in PcdCName:
PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting
@ -2651,7 +2799,7 @@ class DscBuildData(PlatformBuildClassObject):
if DefaultStore not in DefaultStoresDefine: if DefaultStore not in DefaultStoresDefine:
EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore, EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,
File=self.MetaFile, Line=Dummy5) File=self.MetaFile, Line=Dummy5)
if "." not in TokenSpaceGuid: if "." not in TokenSpaceGuid and "[" not in PcdCName:
PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5)) PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting
@ -2814,7 +2962,7 @@ class DscBuildData(PlatformBuildClassObject):
if SkuName not in AvailableSkuIdSet: if SkuName not in AvailableSkuIdSet:
EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName, EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
File=self.MetaFile, Line=Dummy5) File=self.MetaFile, Line=Dummy5)
if "." not in TokenSpaceGuid: if "." not in TokenSpaceGuid and "[" not in PcdCName:
PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5)) PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))
PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting

View File

@ -40,6 +40,7 @@ from .MetaFileCommentParser import CheckInfComment
## RegEx for finding file versions ## RegEx for finding file versions
hexVersionPattern = re.compile(r'0[xX][\da-f-A-F]{5,8}') hexVersionPattern = re.compile(r'0[xX][\da-f-A-F]{5,8}')
decVersionPattern = re.compile(r'\d+\.\d+') decVersionPattern = re.compile(r'\d+\.\d+')
CODEPattern = re.compile(r"{CODE\([a-fA-F0-9Xx\{\},\s]*\)}")
## A decorator used to parse macro definition ## A decorator used to parse macro definition
def ParseMacro(Parser): def ParseMacro(Parser):
@ -913,6 +914,10 @@ class DscParser(MetaFileParser):
# #
self._IdMapping = {-1:-1} self._IdMapping = {-1:-1}
self._PcdCodeValue = ""
self._PcdDataTypeCODE = False
self._CurrentPcdName = ""
## Parser starter ## Parser starter
def Start(self): def Start(self):
Content = '' Content = ''
@ -922,6 +927,9 @@ class DscParser(MetaFileParser):
EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile) EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self.MetaFile)
OwnerId = {} OwnerId = {}
Content = self.ProcessMultipleLineCODEValue(Content)
for Index in range(0, len(Content)): for Index in range(0, len(Content)):
Line = CleanString(Content[Index]) Line = CleanString(Content[Index])
# skip empty line # skip empty line
@ -1133,6 +1141,41 @@ class DscParser(MetaFileParser):
def _LibraryInstanceParser(self): def _LibraryInstanceParser(self):
self._ValueList[0] = self._CurrentLine self._ValueList[0] = self._CurrentLine
def ProcessMultipleLineCODEValue(self,Content):
CODEBegin = False
CODELine = ""
continuelinecount = 0
newContent = []
for Index in range(0, len(Content)):
Line = Content[Index]
if CODEBegin:
CODELine = CODELine + Line
continuelinecount +=1
if ")}" in Line:
newContent.append(CODELine)
for _ in range(continuelinecount):
newContent.append("")
CODEBegin = False
CODELine = ""
continuelinecount = 0
else:
if not Line:
newContent.append(Line)
continue
if "{CODE(" not in Line:
newContent.append(Line)
continue
elif CODEPattern.findall(Line):
newContent.append(Line)
continue
else:
CODEBegin = True
CODELine = Line
return newContent
def _DecodeCODEData(self):
pass
## PCD sections parser ## PCD sections parser
# #
# [PcdsFixedAtBuild] # [PcdsFixedAtBuild]
@ -1149,7 +1192,28 @@ class DscParser(MetaFileParser):
# #
@ParseMacro @ParseMacro
def _PcdParser(self): def _PcdParser(self):
if self._PcdDataTypeCODE:
self._PcdCodeValue = self._PcdCodeValue + "\n " + self._CurrentLine
if self._CurrentLine.endswith(")}"):
self._CurrentLine = "|".join((self._CurrentPcdName, self._PcdCodeValue))
self._PcdDataTypeCODE = False
self._PcdCodeValue = ""
else:
self._ValueList = None
return
TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1) TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)
self._CurrentPcdName = TokenList[0]
if TokenList[1].strip().startswith("{CODE"):
self._PcdDataTypeCODE = True
self._PcdCodeValue = TokenList[1].strip()
if self._PcdDataTypeCODE:
if self._CurrentLine.endswith(")}"):
self._PcdDataTypeCODE = False
self._PcdCodeValue = ""
else:
self._ValueList = None
return
self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT) self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)
PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT) PcdNameTockens = GetSplitValueList(TokenList[0], TAB_SPLIT)
if len(PcdNameTockens) == 2: if len(PcdNameTockens) == 2:
@ -1907,6 +1971,17 @@ class DecParser(MetaFileParser):
if self._ValueList[0] not in self._GuidDict: if self._ValueList[0] not in self._GuidDict:
self._GuidDict[self._ValueList[0]] = self._ValueList[1] self._GuidDict[self._ValueList[0]] = self._ValueList[1]
def ParsePcdName(self,namelist):
if "[" in namelist[1]:
pcdname = namelist[1][:namelist[1].index("[")]
arrayindex = namelist[1][namelist[1].index("["):]
namelist[1] = pcdname
if len(namelist) == 2:
namelist.append(arrayindex)
else:
namelist[2] = ".".join((arrayindex,namelist[2]))
return namelist
## PCD sections parser ## PCD sections parser
# #
# [PcdsFixedAtBuild] # [PcdsFixedAtBuild]
@ -1945,9 +2020,16 @@ class DecParser(MetaFileParser):
return return
else: else:
PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT) PcdTockens = self._CurrentLine.split(TAB_VALUE_SPLIT)
PcdNames = PcdTockens[0].split(TAB_SPLIT) PcdNames = self.ParsePcdName(PcdTockens[0].split(TAB_SPLIT))
if len(PcdNames) == 2: if len(PcdNames) == 2:
self._CurrentStructurePcdName = "" if PcdNames[1].strip().endswith("]"):
PcdName = PcdNames[1][:PcdNames[1].index('[')]
Index = PcdNames[1][PcdNames[1].index('['):]
self._ValueList[0] = TAB_SPLIT.join((PcdNames[0],PcdName))
self._ValueList[1] = Index
self._ValueList[2] = PcdTockens[1]
else:
self._CurrentStructurePcdName = ""
else: else:
if self._CurrentStructurePcdName != TAB_SPLIT.join(PcdNames[:2]): if self._CurrentStructurePcdName != TAB_SPLIT.join(PcdNames[:2]):
EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " % (self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])), EdkLogger.error('Parser', FORMAT_INVALID, "Pcd Name does not match: %s and %s " % (self._CurrentStructurePcdName, TAB_SPLIT.join(PcdNames[:2])),