]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/Object/Parser/DecObject.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / DecObject.py
1 ## @file
2 # This file is used to define class objects for DEC file. It will consumed by
3 #DecParser
4 #
5 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
6 #
7 # SPDX-License-Identifier: BSD-2-Clause-Patent
8
9 '''
10 DecObject
11 '''
12
13 ## Import modules
14 #
15 import os.path
16
17 from Library.Misc import Sdict
18 from Library.DataType import TAB_GUIDS
19 from Library.DataType import TAB_PPIS
20 from Library.DataType import TAB_PROTOCOLS
21 from Library.DataType import TAB_DEC_DEFINES
22 from Library.DataType import TAB_INCLUDES
23 from Library.DataType import TAB_LIBRARY_CLASSES
24 from Library.DataType import TAB_USER_EXTENSIONS
25 from Library.DataType import TAB_PCDS
26 from Library.DataType import TAB_ARCH_COMMON
27
28 ## _DecComments
29 #
30 # Base class for all data objects which have head and tail comments
31 #
32 class _DecComments:
33
34 ##constructor
35 #
36 def __init__(self):
37 self._HeadComment = []
38 self._TailComment = []
39
40 ## GetComments
41 #
42 def GetComments(self):
43 return self._HeadComment, self._TailComment
44
45 ## GetHeadComment
46 #
47 def GetHeadComment(self):
48 return self._HeadComment
49
50 ## SetHeadComment
51 #
52 # @param Comment: comment content
53 #
54 def SetHeadComment(self, Comment):
55 self._HeadComment = Comment
56
57 ## GetTailComment
58 #
59 def GetTailComment(self):
60 return self._TailComment
61
62 ## SetTailComment
63 #
64 # @param Comment: comment content
65 #
66 def SetTailComment(self, Comment):
67 self._TailComment = Comment
68
69 ## _DecBaseObject
70 #
71 # Base class that hold common info
72 #
73 class _DecBaseObject(_DecComments):
74 def __init__(self, PkgFullName):
75 _DecComments.__init__(self)
76 #
77 # Key is combined with (Arch, SectionType)
78 # Default is common
79 #
80 self.ValueDict = Sdict()
81 self._PkgFullName = PkgFullName
82 self._PackagePath, self._FileName = os.path.split(PkgFullName)
83 self._SecName = ''
84
85 ## GetSectionName
86 #
87 def GetSectionName(self):
88 return self._SecName
89
90 ## GetPackagePath
91 #
92 def GetPackagePath(self):
93 return self._PackagePath
94
95 ## GetPackageFile
96 #
97 def GetPackageFile(self):
98 return self._FileName
99
100 ## GetPackageFullName
101 #
102 def GetPackageFullName(self):
103 return self._PkgFullName
104
105 ## AddItem
106 # Add sub-item to current object, sub-class should override it if needed
107 #
108 # @param Item: Sub-item to be added
109 # @param Scope: A list store section name and arch info
110 #
111 def AddItem(self, Item, Scope):
112 if not Scope:
113 return
114 if not Item:
115 return
116 ArchModule = []
117 for Ele in Scope:
118 if Ele[1] in self.ValueDict:
119 self.ValueDict[Ele[1]].append(Item)
120 else:
121 self.ValueDict[Ele[1]] = [Item]
122 ArchModule.append(Ele[1])
123 Item.ArchAndModuleType = ArchModule
124
125 ## _GetItemByArch
126 # Helper class used by sub-class
127 # @param Arch: arch
128 #
129 def _GetItemByArch(self, Arch):
130 Arch = Arch.upper()
131 if Arch not in self.ValueDict:
132 return []
133 return self.ValueDict[Arch]
134
135 ## _GetAllItems
136 # Get all items, union all arches, items in returned list are unique
137 #
138 def _GetAllItems(self):
139 Retlst = []
140 for Arch in self.ValueDict:
141 for Item in self.ValueDict[Arch]:
142 if Item not in Retlst:
143 Retlst.append(Item)
144 return Retlst
145
146 ## _DecItemBaseObject
147 #
148 # Module type and arch the item belongs to
149 #
150 class _DecItemBaseObject(_DecComments):
151 def __init__(self):
152 _DecComments.__init__(self)
153 #
154 # Item's arch, if PCD, also include PCD type
155 #
156 self.ArchAndModuleType = []
157
158 ## GetArchList
159 #
160 def GetArchList(self):
161 ArchSet = set()
162 for Arch in self.ArchAndModuleType:
163 ArchSet.add(Arch)
164 return list(ArchSet)
165
166 ## DecDefineObject
167 #
168 # Class to hold define section information
169 #
170 class DecDefineObject(_DecBaseObject):
171 def __init__(self, PkgFullName):
172 _DecBaseObject.__init__(self, PkgFullName)
173 self._SecName = TAB_DEC_DEFINES.upper()
174 self._DecSpec = ''
175 self._PkgName = ''
176 self._PkgGuid = ''
177 self._PkgVersion = ''
178 self._PkgUniFile = ''
179
180 ## GetPackageSpecification
181 #
182 def GetPackageSpecification(self):
183 return self._DecSpec
184
185 def SetPackageSpecification(self, DecSpec):
186 self._DecSpec = DecSpec
187
188 ## GetPackageName
189 #
190 def GetPackageName(self):
191 return self._PkgName
192
193 def SetPackageName(self, PkgName):
194 self._PkgName = PkgName
195
196 ## GetPackageGuid
197 #
198 def GetPackageGuid(self):
199 return self._PkgGuid
200
201 def SetPackageGuid(self, PkgGuid):
202 self._PkgGuid = PkgGuid
203
204 ## GetPackageVersion
205 #
206 def GetPackageVersion(self):
207 return self._PkgVersion
208
209 def SetPackageVersion(self, PkgVersion):
210 self._PkgVersion = PkgVersion
211
212 ## GetPackageUniFile
213 #
214 def GetPackageUniFile(self):
215 return self._PkgUniFile
216
217 def SetPackageUniFile(self, PkgUniFile):
218 self._PkgUniFile = PkgUniFile
219
220 ## GetDefines
221 #
222 def GetDefines(self):
223 return self._GetItemByArch(TAB_ARCH_COMMON)
224
225 ## GetAllDefines
226 #
227 def GetAllDefines(self):
228 return self._GetAllItems()
229
230 ## DecDefineItemObject
231 #
232 # Each item of define section
233 #
234 class DecDefineItemObject(_DecItemBaseObject):
235 def __init__(self):
236 _DecItemBaseObject.__init__(self)
237 self.Key = ''
238 self.Value = ''
239
240 ## __hash__
241 #
242 def __hash__(self):
243 return hash(self.Key + self.Value)
244
245 ## __eq__
246 #
247 def __eq__(self, Other):
248 return id(self) == id(Other)
249
250 ## __str__
251 #
252 def __str__(self):
253 return str(self.ArchAndModuleType) + '\n' + self.Key + \
254 ' = ' + self.Value
255
256 ## DecIncludeObject
257 #
258 # Class to hold include section info
259 #
260 class DecIncludeObject(_DecBaseObject):
261 def __init__(self, PkgFullName):
262 _DecBaseObject.__init__(self, PkgFullName)
263 self._SecName = TAB_INCLUDES.upper()
264
265 ## GetIncludes
266 #
267 def GetIncludes(self, Arch=TAB_ARCH_COMMON):
268 return self._GetItemByArch(Arch)
269
270 ## GetAllIncludes
271 #
272 def GetAllIncludes(self):
273 return self._GetAllItems()
274
275 ## DecIncludeItemObject
276 #
277 # Item of include section
278 #
279 class DecIncludeItemObject(_DecItemBaseObject):
280 def __init__(self, File, Root):
281 self.File = File
282 self.Root = Root
283 _DecItemBaseObject.__init__(self)
284
285 ## __hash__
286 #
287 def __hash__(self):
288 return hash(self.File)
289
290 ## __eq__
291 #
292 def __eq__(self, Other):
293 return id(self) == id(Other)
294
295 ## __str__
296 #
297 def __str__(self):
298 return self.File
299
300 ## DecLibraryclassObject
301 #
302 # Class to hold library class section info
303 #
304 class DecLibraryclassObject(_DecBaseObject):
305 def __init__(self, PkgFullName):
306 _DecBaseObject.__init__(self, PkgFullName)
307 self._PackagePath, self._FileName = os.path.split(PkgFullName)
308 self._SecName = TAB_LIBRARY_CLASSES.upper()
309
310 ## GetLibraryclasses
311 #
312 def GetLibraryclasses(self, Arch=TAB_ARCH_COMMON):
313 return self._GetItemByArch(Arch)
314
315 ## GetAllLibraryclasses
316 #
317 def GetAllLibraryclasses(self):
318 return self._GetAllItems()
319
320 ## DecLibraryclassItemObject
321 # Item of library class section
322 #
323 class DecLibraryclassItemObject(_DecItemBaseObject):
324 def __init__(self, Libraryclass, File, Root):
325 _DecItemBaseObject.__init__(self)
326 self.File = File
327 self.Root = Root
328 self.Libraryclass = Libraryclass
329
330 ## __hash__
331 #
332 def __hash__(self):
333 return hash(self.Libraryclass + self.File)
334
335 ## __eq__
336 #
337 def __eq__(self, Other):
338 return id(self) == id(Other)
339
340 ## __str__
341 #
342 def __str__(self):
343 return self.Libraryclass + '|' + self.File
344
345 ## DecPcdObject
346 # Class to hold PCD section
347 #
348 class DecPcdObject(_DecBaseObject):
349 def __init__(self, PkgFullName):
350 _DecBaseObject.__init__(self, PkgFullName)
351 self._SecName = TAB_PCDS.upper()
352
353 ## AddItem
354 #
355 # Diff from base class
356 #
357 # @param Item: Item
358 # @param Scope: Scope
359 #
360 def AddItem(self, Item, Scope):
361 if not Scope:
362 return
363 if not Item:
364 return
365 ArchModule = []
366 for Type, Arch in Scope:
367 if (Type, Arch) in self.ValueDict:
368 self.ValueDict[Type, Arch].append(Item)
369 else:
370 self.ValueDict[Type, Arch] = [Item]
371 ArchModule.append([Type, Arch])
372 Item.ArchAndModuleType = ArchModule
373
374 ## GetPcds
375 #
376 # @param PcdType: PcdType
377 # @param Arch: Arch
378 #
379 def GetPcds(self, PcdType, Arch=TAB_ARCH_COMMON):
380 PcdType = PcdType.upper()
381 Arch = Arch.upper()
382 if (PcdType, Arch) not in self.ValueDict:
383 return []
384 return self.ValueDict[PcdType, Arch]
385
386 ## GetPcdsByType
387 #
388 # @param PcdType: PcdType
389 #
390 def GetPcdsByType(self, PcdType):
391 PcdType = PcdType.upper()
392 Retlst = []
393 for TypeInDict, Arch in self.ValueDict:
394 if TypeInDict != PcdType:
395 continue
396 for Item in self.ValueDict[PcdType, Arch]:
397 if Item not in Retlst:
398 Retlst.append(Item)
399 return Retlst
400
401 ## DecPcdItemObject
402 #
403 # Item of PCD section
404 #
405 # @param _DecItemBaseObject: _DecItemBaseObject object
406 #
407 class DecPcdItemObject(_DecItemBaseObject):
408 def __init__(self, Guid, Name, Value, DatumType,
409 Token, MaxDatumSize=''):
410 _DecItemBaseObject.__init__(self)
411 self.TokenCName = Name
412 self.TokenSpaceGuidCName = Guid
413 self.DatumType = DatumType
414 self.DefaultValue = Value
415 self.TokenValue = Token
416 self.MaxDatumSize = MaxDatumSize
417
418 ## __hash__
419 #
420 def __hash__(self):
421 return hash(self.TokenSpaceGuidCName + self.TokenCName)
422
423 ## __eq__
424 #
425 def __eq__(self, Other):
426 return id(self) == id(Other)
427
428 ## GetArchListOfType
429 #
430 # @param PcdType: PcdType
431 #
432 def GetArchListOfType(self, PcdType):
433 ItemSet = set()
434 PcdType = PcdType.upper()
435 for Type, Arch in self.ArchAndModuleType:
436 if Type != PcdType:
437 continue
438 ItemSet.add(Arch)
439 return list(ItemSet)
440
441 ## DecGuidObjectBase
442 #
443 # Base class for PPI, Protocol, and GUID.
444 # Hold same data but has different method for clarification in sub-class
445 #
446 # @param _DecBaseObject: Dec Base Object
447 #
448 class DecGuidObjectBase(_DecBaseObject):
449 def __init__(self, PkgFullName):
450 _DecBaseObject.__init__(self, PkgFullName)
451
452 ## GetGuidStyleItems
453 #
454 # @param Arch: Arch
455 #
456 def GetGuidStyleItems(self, Arch=TAB_ARCH_COMMON):
457 return self._GetItemByArch(Arch)
458
459 ## GetGuidStyleAllItems
460 #
461 def GetGuidStyleAllItems(self):
462 return self._GetAllItems()
463
464 ## DecGuidItemObject
465 #
466 # Item of GUID, PPI and Protocol section
467 #
468 # @param _DecItemBaseObject: Dec Item Base Object
469 #
470 class DecGuidItemObject(_DecItemBaseObject):
471 def __init__(self, CName, GuidCValue, GuidString):
472 _DecItemBaseObject.__init__(self)
473 self.GuidCName = CName
474 self.GuidCValue = GuidCValue
475 self.GuidString = GuidString
476
477 ## __hash__
478 #
479 def __hash__(self):
480 return hash(self.GuidCName)
481
482 ## __eq__
483 #
484 def __eq__(self, Other):
485 return id(self) == id(Other)
486
487 ## __str__
488 #
489 def __str__(self):
490 return self.GuidCName + ' = ' + self.GuidCValue
491
492 ## DecGuidObject
493 #
494 # Class for GUID section
495 #
496 # @param DecGuidObjectBase: Dec Guid Object Base
497 #
498 class DecGuidObject(DecGuidObjectBase):
499 def __init__(self, PkgFullName):
500 DecGuidObjectBase.__init__(self, PkgFullName)
501 self._SecName = TAB_GUIDS.upper()
502
503 ## GetGuids
504 #
505 # @param Arch: Arch
506 #
507 def GetGuids(self, Arch=TAB_ARCH_COMMON):
508 return self._GetItemByArch(Arch)
509
510 ## GetAllGuids
511 #
512 def GetAllGuids(self):
513 return self._GetAllItems()
514
515 ## DecPpiObject
516 #
517 # Class for PPI section
518 #
519 # @param DecGuidObjectBase: Dec Guid Object Base
520 #
521 class DecPpiObject(DecGuidObjectBase):
522 def __init__(self, PkgFullName):
523 DecGuidObjectBase.__init__(self, PkgFullName)
524 self._SecName = TAB_PPIS.upper()
525
526 ## GetPpis
527 #
528 # @param Arch: Arch
529 #
530 def GetPpis(self, Arch=TAB_ARCH_COMMON):
531 return self._GetItemByArch(Arch)
532
533 ## GetAllPpis
534 #
535 def GetAllPpis(self):
536 return self._GetAllItems()
537
538 ## DecProtocolObject
539 #
540 # Class for protocol section
541 #
542 # @param DecGuidObjectBase: Dec Guid Object Base
543 #
544 class DecProtocolObject(DecGuidObjectBase):
545 def __init__(self, PkgFullName):
546 DecGuidObjectBase.__init__(self, PkgFullName)
547 self._SecName = TAB_PROTOCOLS.upper()
548
549 ## GetProtocols
550 #
551 # @param Arch: Arch
552 #
553 def GetProtocols(self, Arch=TAB_ARCH_COMMON):
554 return self._GetItemByArch(Arch)
555
556 ## GetAllProtocols
557 #
558 def GetAllProtocols(self):
559 return self._GetAllItems()
560
561 ## DecUserExtensionObject
562 #
563 # Class for user extension section
564 #
565 # @param _DecBaseObject: Dec Guid Object Base
566 #
567 class DecUserExtensionObject(_DecBaseObject):
568 def __init__(self, PkgFullName):
569 _DecBaseObject.__init__(self, PkgFullName)
570 self._SecName = TAB_USER_EXTENSIONS.upper()
571 self.ItemList = []
572
573 ## GetProtocols
574 #
575 # @param Item: Item
576 # @param Scope: Scope
577 #
578 def AddItem(self, Item, Scope):
579 if not Scope:
580 pass
581 if not Item:
582 return
583 self.ItemList.append(Item)
584
585 ## GetAllUserExtensions
586 #
587 def GetAllUserExtensions(self):
588 return self.ItemList
589
590
591 ## DecUserExtensionItemObject
592 # Item for user extension section
593 #
594 # @param _DecItemBaseObject: Dec Item Base Object
595 #
596 class DecUserExtensionItemObject(_DecItemBaseObject):
597 def __init__(self):
598 _DecItemBaseObject.__init__(self)
599 self.UserString = ''
600 self.UserId = ''
601 self.IdString = ''
602
603
604
605