From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=jaben.carsey@intel.com; receiver=edk2-devel@lists.01.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 10C832034C8DD for ; Fri, 27 Apr 2018 15:33:03 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2018 15:33:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,336,1520924400"; d="scan'208";a="54252871" Received: from jcarsey-desk1.amr.corp.intel.com ([10.7.159.144]) by orsmga002.jf.intel.com with ESMTP; 27 Apr 2018 15:33:01 -0700 From: Jaben Carsey To: edk2-devel@lists.01.org Cc: Liming Gao , Yonghong Zhu Date: Fri, 27 Apr 2018 15:32:47 -0700 Message-Id: <0c0ee4469616a05baf8f01294d22a5315b5069ba.1524868034.git.jaben.carsey@intel.com> X-Mailer: git-send-email 2.16.2.windows.1 In-Reply-To: References: In-Reply-To: References: Subject: [PATCH v1 33/42] BaseTools: AutoGen - add Opcode constants X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Apr 2018 22:33:03 -0000 add constants for dependency expression opcode strings use these new opcode string constants Cc: Liming Gao Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jaben Carsey --- BaseTools/Source/Python/AutoGen/GenDepex.py | 112 ++++++++++---------- BaseTools/Source/Python/Common/DataType.py | 12 +++ 2 files changed, 67 insertions(+), 57 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py b/BaseTools/Source/Python/AutoGen/GenDepex.py index 9acea8f6bfed..3dcbad5be666 100644 --- a/BaseTools/Source/Python/AutoGen/GenDepex.py +++ b/BaseTools/Source/Python/AutoGen/GenDepex.py @@ -1,7 +1,7 @@ ## @file # This file is used to generate DEPEX file for module's dependency expression # -# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
# 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 @@ -24,6 +24,7 @@ from Common.Misc import SaveFileOnChange from Common.Misc import GuidStructureStringToGuidString from Common import EdkLogger as EdkLogger from Common.BuildVersion import gBUILD_VERSION +from Common.DataType import * ## Regular expression for matching "DEPENDENCY_START ... DEPENDENCY_END" gStartClosePattern = re.compile(".*DEPENDENCY_START(.+)DEPENDENCY_END.*", re.S) @@ -70,65 +71,62 @@ class DependencyExpression: ) OpcodePriority = { - "AND" : 1, - "OR" : 1, - "NOT" : 2, - # "SOR" : 9, - # "BEFORE": 9, - # "AFTER" : 9, + DEPEX_OPCODE_AND : 1, + DEPEX_OPCODE_OR : 1, + DEPEX_OPCODE_NOT : 2, } Opcode = { "PEI" : { - "PUSH" : 0x02, - "AND" : 0x03, - "OR" : 0x04, - "NOT" : 0x05, - "TRUE" : 0x06, - "FALSE" : 0x07, - "END" : 0x08 + DEPEX_OPCODE_PUSH : 0x02, + DEPEX_OPCODE_AND : 0x03, + DEPEX_OPCODE_OR : 0x04, + DEPEX_OPCODE_NOT : 0x05, + DEPEX_OPCODE_TRUE : 0x06, + DEPEX_OPCODE_FALSE : 0x07, + DEPEX_OPCODE_END : 0x08 }, "DXE" : { - "BEFORE": 0x00, - "AFTER" : 0x01, - "PUSH" : 0x02, - "AND" : 0x03, - "OR" : 0x04, - "NOT" : 0x05, - "TRUE" : 0x06, - "FALSE" : 0x07, - "END" : 0x08, - "SOR" : 0x09 + DEPEX_OPCODE_BEFORE: 0x00, + DEPEX_OPCODE_AFTER : 0x01, + DEPEX_OPCODE_PUSH : 0x02, + DEPEX_OPCODE_AND : 0x03, + DEPEX_OPCODE_OR : 0x04, + DEPEX_OPCODE_NOT : 0x05, + DEPEX_OPCODE_TRUE : 0x06, + DEPEX_OPCODE_FALSE : 0x07, + DEPEX_OPCODE_END : 0x08, + DEPEX_OPCODE_SOR : 0x09 }, "MM" : { - "BEFORE": 0x00, - "AFTER" : 0x01, - "PUSH" : 0x02, - "AND" : 0x03, - "OR" : 0x04, - "NOT" : 0x05, - "TRUE" : 0x06, - "FALSE" : 0x07, - "END" : 0x08, - "SOR" : 0x09 + DEPEX_OPCODE_BEFORE: 0x00, + DEPEX_OPCODE_AFTER : 0x01, + DEPEX_OPCODE_PUSH : 0x02, + DEPEX_OPCODE_AND : 0x03, + DEPEX_OPCODE_OR : 0x04, + DEPEX_OPCODE_NOT : 0x05, + DEPEX_OPCODE_TRUE : 0x06, + DEPEX_OPCODE_FALSE : 0x07, + DEPEX_OPCODE_END : 0x08, + DEPEX_OPCODE_SOR : 0x09 } } # all supported op codes and operands - SupportedOpcode = ["BEFORE", "AFTER", "PUSH", "AND", "OR", "NOT", "END", "SOR"] - SupportedOperand = ["TRUE", "FALSE"] + SupportedOpcode = [DEPEX_OPCODE_BEFORE, DEPEX_OPCODE_AFTER, DEPEX_OPCODE_PUSH, DEPEX_OPCODE_AND, DEPEX_OPCODE_OR, DEPEX_OPCODE_NOT, DEPEX_OPCODE_END, DEPEX_OPCODE_SOR] + SupportedOperand = [DEPEX_OPCODE_TRUE, DEPEX_OPCODE_FALSE] - OpcodeWithSingleOperand = ['NOT', 'BEFORE', 'AFTER'] - OpcodeWithTwoOperand = ['AND', 'OR'] + OpcodeWithSingleOperand = [DEPEX_OPCODE_NOT, DEPEX_OPCODE_BEFORE, DEPEX_OPCODE_AFTER] + OpcodeWithTwoOperand = [DEPEX_OPCODE_AND, DEPEX_OPCODE_OR] # op code that should not be the last one - NonEndingOpcode = ["AND", "OR", "NOT", 'SOR'] + NonEndingOpcode = [DEPEX_OPCODE_AND, DEPEX_OPCODE_OR, DEPEX_OPCODE_NOT, DEPEX_OPCODE_SOR] # op code must not present at the same time - ExclusiveOpcode = ["BEFORE", "AFTER"] + ExclusiveOpcode = [DEPEX_OPCODE_BEFORE, DEPEX_OPCODE_AFTER] # op code that should be the first one if it presents - AboveAllOpcode = ["SOR", "BEFORE", "AFTER"] + AboveAllOpcode = [DEPEX_OPCODE_SOR, DEPEX_OPCODE_BEFORE, DEPEX_OPCODE_AFTER] # # open and close brace must be taken as individual tokens @@ -200,7 +198,7 @@ class DependencyExpression: break self.PostfixNotation.append(Stack.pop()) elif Token in self.OpcodePriority: - if Token == "NOT": + if Token == DEPEX_OPCODE_NOT: if LastToken not in self.SupportedOpcode + ['(', '', None]: EdkLogger.error("GenDepex", PARSER_ERROR, "Invalid dependency expression: missing operator before NOT", ExtraData="Near %s" % LastToken) @@ -222,10 +220,10 @@ class DependencyExpression: ExtraData="Near %s" % LastToken) if len(self.OpcodeList) == 0 or self.OpcodeList[-1] not in self.ExclusiveOpcode: if Token not in self.SupportedOperand: - self.PostfixNotation.append("PUSH") + self.PostfixNotation.append(DEPEX_OPCODE_PUSH) # check if OP is valid in this phase elif Token in self.Opcode[self.Phase]: - if Token == "END": + if Token == DEPEX_OPCODE_END: break self.OpcodeList.append(Token) else: @@ -241,8 +239,8 @@ class DependencyExpression: ExtraData=str(self)) while len(Stack) > 0: self.PostfixNotation.append(Stack.pop()) - if self.PostfixNotation[-1] != 'END': - self.PostfixNotation.append("END") + if self.PostfixNotation[-1] != DEPEX_OPCODE_END: + self.PostfixNotation.append(DEPEX_OPCODE_END) ## Validate the dependency expression def ValidateOpcode(self): @@ -262,20 +260,20 @@ class DependencyExpression: if len(self.PostfixNotation) < 3: EdkLogger.error("GenDepex", PARSER_ERROR, "Missing operand for %s" % Op, ExtraData=str(self)) - if self.TokenList[-1] != 'END' and self.TokenList[-1] in self.NonEndingOpcode: + if self.TokenList[-1] != DEPEX_OPCODE_END and self.TokenList[-1] in self.NonEndingOpcode: EdkLogger.error("GenDepex", PARSER_ERROR, "Extra %s at the end of the dependency expression" % self.TokenList[-1], ExtraData=str(self)) - if self.TokenList[-1] == 'END' and self.TokenList[-2] in self.NonEndingOpcode: + if self.TokenList[-1] == DEPEX_OPCODE_END and self.TokenList[-2] in self.NonEndingOpcode: EdkLogger.error("GenDepex", PARSER_ERROR, "Extra %s at the end of the dependency expression" % self.TokenList[-2], ExtraData=str(self)) - if "END" in self.TokenList and "END" != self.TokenList[-1]: + if DEPEX_OPCODE_END in self.TokenList and DEPEX_OPCODE_END != self.TokenList[-1]: EdkLogger.error("GenDepex", PARSER_ERROR, "Extra expressions after END", ExtraData=str(self)) ## Simply optimize the dependency expression by removing duplicated operands def Optimize(self): ValidOpcode = list(set(self.OpcodeList)) - if len(ValidOpcode) != 1 or ValidOpcode[0] not in ['AND', 'OR']: + if len(ValidOpcode) != 1 or ValidOpcode[0] not in [DEPEX_OPCODE_AND, DEPEX_OPCODE_OR]: return Op = ValidOpcode[0] NewOperand = [] @@ -284,14 +282,14 @@ class DependencyExpression: if Token in self.SupportedOpcode or Token in NewOperand: continue AllOperand.add(Token) - if Token == 'TRUE': - if Op == 'AND': + if Token == DEPEX_OPCODE_TRUE: + if Op == DEPEX_OPCODE_AND: continue else: NewOperand.append(Token) break - elif Token == 'FALSE': - if Op == 'OR': + elif Token == DEPEX_OPCODE_FALSE: + if Op == DEPEX_OPCODE_OR: continue else: NewOperand.append(Token) @@ -299,13 +297,13 @@ class DependencyExpression: NewOperand.append(Token) # don't generate depex if only TRUE operand left - if self.ModuleType == 'PEIM' and len(NewOperand) == 1 and NewOperand[0] == 'TRUE': + if self.ModuleType == 'PEIM' and len(NewOperand) == 1 and NewOperand[0] == DEPEX_OPCODE_TRUE: self.PostfixNotation = [] return # don't generate depex if all operands are architecture protocols if self.ModuleType in ['UEFI_DRIVER', 'DXE_DRIVER', 'DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER', 'DXE_SMM_DRIVER', 'MM_STANDALONE'] and \ - Op == 'AND' and \ + Op == DEPEX_OPCODE_AND and \ self.ArchProtocols == set([GuidStructureStringToGuidString(Guid) for Guid in AllOperand]): self.PostfixNotation = [] return @@ -371,7 +369,7 @@ class DependencyExpression: versionNumber = ("0.04" + " " + gBUILD_VERSION) __version__ = "%prog Version " + versionNumber -__copyright__ = "Copyright (c) 2007-2010, Intel Corporation All rights reserved." +__copyright__ = "Copyright (c) 2007-2018, Intel Corporation All rights reserved." __usage__ = "%prog [options] [dependency_expression_file]" ## Parse command line options diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py index 8af94354620c..48700ba82012 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -473,6 +473,18 @@ DATABASE_PATH = ":memory:" #"BuildDatabase.db" # used by ECC MODIFIER_LIST = ['IN', 'OUT', 'OPTIONAL', 'UNALIGNED', 'EFI_RUNTIMESERVICE', 'EFI_BOOTSERVICE', 'EFIAPI'] +# Dependency Opcodes +DEPEX_OPCODE_BEFORE = "BEFORE" +DEPEX_OPCODE_AFTER = "AFTER" +DEPEX_OPCODE_PUSH = "PUSH" +DEPEX_OPCODE_AND = "AND" +DEPEX_OPCODE_OR = "OR" +DEPEX_OPCODE_NOT = "NOT" +DEPEX_OPCODE_END = "END" +DEPEX_OPCODE_SOR = "SOR" +DEPEX_OPCODE_TRUE = "TRUE" +DEPEX_OPCODE_FALSE = "FALSE" + # Dependency Expression DEPEX_SUPPORTED_OPCODE = ["BEFORE", "AFTER", "PUSH", "AND", "OR", "NOT", "END", "SOR", "TRUE", "FALSE", '(', ')'] -- 2.16.2.windows.1