diff options
Diffstat (limited to 'sys/contrib/dev/acpica/compiler/asltree.c')
-rw-r--r-- | sys/contrib/dev/acpica/compiler/asltree.c | 1162 |
1 files changed, 121 insertions, 1041 deletions
diff --git a/sys/contrib/dev/acpica/compiler/asltree.c b/sys/contrib/dev/acpica/compiler/asltree.c index d99bf9b..b510d59 100644 --- a/sys/contrib/dev/acpica/compiler/asltree.c +++ b/sys/contrib/dev/acpica/compiler/asltree.c @@ -1,6 +1,6 @@ /****************************************************************************** * - * Module Name: asltree - parse tree management + * Module Name: asltree - Parse tree management * *****************************************************************************/ @@ -152,253 +152,27 @@ #include <contrib/dev/acpica/compiler/aslcompiler.h> #include "aslcompiler.y.h" #include <contrib/dev/acpica/include/acapps.h> -#include <contrib/dev/acpica/include/acconvert.h> -#include <time.h> #define _COMPONENT ACPI_COMPILER ACPI_MODULE_NAME ("asltree") -/* Local prototypes */ - -static ACPI_PARSE_OBJECT * -TrGetNextNode ( - void); - - -/******************************************************************************* - * - * FUNCTION: TrSetParent - * - * PARAMETERS: Op - To be set to new parent - * ParentOp - The parent - * - * RETURN: None, sets Op parent directly - * - * DESCRIPTION: Change the parent of a parse op. - * - ******************************************************************************/ - -void -TrSetParent ( - ACPI_PARSE_OBJECT *Op, - ACPI_PARSE_OBJECT *ParentOp) -{ - - Op->Asl.Parent = ParentOp; -} - /******************************************************************************* * - * FUNCTION: TrGetNextNode + * FUNCTION: TrSetOpIntegerValue * - * PARAMETERS: None + * PARAMETERS: ParseOpcode - New opcode to be assigned to the op + * Op - An existing parse op * - * RETURN: New parse node. Aborts on allocation failure + * RETURN: The updated op * - * DESCRIPTION: Allocate a new parse node for the parse tree. Bypass the local - * dynamic memory manager for performance reasons (This has a - * major impact on the speed of the compiler.) - * - ******************************************************************************/ - -static ACPI_PARSE_OBJECT * -TrGetNextNode ( - void) -{ - ASL_CACHE_INFO *Cache; - - - if (Gbl_ParseOpCacheNext >= Gbl_ParseOpCacheLast) - { - /* Allocate a new buffer */ - - Cache = UtLocalCalloc (sizeof (Cache->Next) + - (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE)); - - /* Link new cache buffer to head of list */ - - Cache->Next = Gbl_ParseOpCacheList; - Gbl_ParseOpCacheList = Cache; - - /* Setup cache management pointers */ - - Gbl_ParseOpCacheNext = ACPI_CAST_PTR (ACPI_PARSE_OBJECT, Cache->Buffer); - Gbl_ParseOpCacheLast = Gbl_ParseOpCacheNext + ASL_PARSEOP_CACHE_SIZE; - } - - Gbl_ParseOpCount++; - return (Gbl_ParseOpCacheNext++); -} - - -/******************************************************************************* - * - * FUNCTION: TrAllocateNode - * - * PARAMETERS: ParseOpcode - Opcode to be assigned to the node - * - * RETURN: New parse node. Aborts on allocation failure - * - * DESCRIPTION: Allocate and initialize a new parse node for the parse tree + * DESCRIPTION: Used to set the integer value of a op, + * usually to a specific size (8, 16, 32, or 64 bits) * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrAllocateNode ( - UINT32 ParseOpcode) -{ - ACPI_PARSE_OBJECT *Op; - ACPI_PARSE_OBJECT *LatestNode; - - - Op = TrGetNextNode (); - - Op->Asl.ParseOpcode = (UINT16) ParseOpcode; - Op->Asl.Filename = Gbl_Files[ASL_FILE_INPUT].Filename; - Op->Asl.LineNumber = Gbl_CurrentLineNumber; - Op->Asl.LogicalLineNumber = Gbl_LogicalLineNumber; - Op->Asl.LogicalByteOffset = Gbl_CurrentLineOffset; - Op->Asl.Column = Gbl_CurrentColumn; - - UtSetParseOpName (Op); - - /* The following is for capturing comments */ - - if(Gbl_CaptureComments) - { - LatestNode = Gbl_CommentState.Latest_Parse_Node; - Op->Asl.InlineComment = NULL; - Op->Asl.EndNodeComment = NULL; - Op->Asl.CommentList = NULL; - Op->Asl.FileChanged = FALSE; - - /* - * Check to see if the file name has changed before resetting the - * latest parse node. - */ - if (LatestNode && - (ParseOpcode != PARSEOP_INCLUDE) && - (ParseOpcode != PARSEOP_INCLUDE_END) && - strcmp (LatestNode->Asl.Filename, Op->Asl.Filename)) - { - CvDbgPrint ("latest node: %s\n", LatestNode->Asl.ParseOpName); - Op->Asl.FileChanged = TRUE; - if (Gbl_IncludeFileStack) - { - Op->Asl.ParentFilename = Gbl_IncludeFileStack->Filename; - } - else - { - Op->Asl.ParentFilename = NULL; - } - } - - Gbl_CommentState.Latest_Parse_Node = Op; - CvDbgPrint ("trallocatenode=Set latest parse node to this node.\n"); - CvDbgPrint (" Op->Asl.ParseOpName = %s\n", - Gbl_CommentState.Latest_Parse_Node->Asl.ParseOpName); - CvDbgPrint (" Op->Asl.ParseOpcode = 0x%x\n", ParseOpcode); - - if (Op->Asl.FileChanged) - { - CvDbgPrint(" file has been changed!\n"); - } - - /* - * if this parse op's syntax uses () and {} (i.e. Package(1){0x00}) then - * set a flag in the comment state. This facilitates paring comments for - * these types of opcodes. - */ - if ((CvParseOpBlockType(Op) == (BLOCK_PAREN | BLOCK_BRACE)) && - (ParseOpcode != PARSEOP_DEFINITION_BLOCK)) - { - CvDbgPrint ("Parsing paren/Brace node now!\n"); - Gbl_CommentState.ParsingParenBraceNode = Op; - } - - if (Gbl_Comment_List_Head) - { - CvDbgPrint ("Transferring...\n"); - Op->Asl.CommentList = Gbl_Comment_List_Head; - Gbl_Comment_List_Head = NULL; - Gbl_Comment_List_Tail = NULL; - CvDbgPrint (" Transferred current comment list to this node.\n"); - CvDbgPrint (" %s\n", Op->Asl.CommentList->Comment); - } - if (Gbl_Inline_Comment_Buffer) - { - Op->Asl.InlineComment = Gbl_Inline_Comment_Buffer; - Gbl_Inline_Comment_Buffer = NULL; - CvDbgPrint ("Transferred current inline comment list to this node.\n"); - } - - } - - return (Op); -} - - -/******************************************************************************* - * - * FUNCTION: TrReleaseNode - * - * PARAMETERS: Op - Op to be released - * - * RETURN: None - * - * DESCRIPTION: "release" a node. In truth, nothing is done since the node - * is part of a larger buffer - * - ******************************************************************************/ - -void -TrReleaseNode ( - ACPI_PARSE_OBJECT *Op) -{ - - return; -} - - -/******************************************************************************* - * - * FUNCTION: TrSetCurrentFilename - * - * PARAMETERS: Op - An existing parse node - * - * RETURN: None - * - * DESCRIPTION: Save the include file filename. Used for debug output only. - * - ******************************************************************************/ - -void -TrSetCurrentFilename ( - ACPI_PARSE_OBJECT *Op) -{ - Op->Asl.Filename = Gbl_PreviousIncludeFilename; -} - - -/******************************************************************************* - * - * FUNCTION: TrUpdateNode - * - * PARAMETERS: ParseOpcode - New opcode to be assigned to the node - * Op - An existing parse node - * - * RETURN: The updated node - * - * DESCRIPTION: Change the parse opcode assigned to a node. Usually used to - * change an opcode to DEFAULT_ARG so that the node is ignored - * during the code generation. Also used to set generic integers - * to a specific size (8, 16, 32, or 64 bits) - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -TrUpdateNode ( +TrSetOpIntegerValue ( UINT32 ParseOpcode, ACPI_PARSE_OBJECT *Op) { @@ -409,7 +183,7 @@ TrUpdateNode ( } DbgPrint (ASL_PARSE_OUTPUT, - "\nUpdateNode: Old - %s, New - %s\n", + "\nUpdateOp: Old - %s, New - %s\n", UtGetOpName (Op->Asl.ParseOpcode), UtGetOpName (ParseOpcode)); @@ -477,7 +251,8 @@ TrUpdateNode ( break; } - /* Converter: if this is a method invocation, turn off capture comments. */ + /* Converter: if this is a method invocation, turn off capture comments */ + if (Gbl_CaptureComments && (ParseOpcode == PARSEOP_METHODCALL)) { @@ -490,164 +265,19 @@ TrUpdateNode ( /******************************************************************************* * - * FUNCTION: TrPrintNodeCompileFlags - * - * PARAMETERS: Flags - Flags word to be decoded - * - * RETURN: None - * - * DESCRIPTION: Decode a flags word to text. Displays all flags that are set. - * - ******************************************************************************/ - -void -TrPrintNodeCompileFlags ( - UINT32 Flags) -{ - UINT32 i; - UINT32 FlagBit = 1; - char *FlagName = NULL; - - - for (i = 0; i < 32; i++) - { - switch (Flags & FlagBit) - { - case NODE_VISITED: - - FlagName = "NODE_VISITED"; - break; - - case NODE_AML_PACKAGE: - - FlagName = "NODE_AML_PACKAGE"; - break; - - case NODE_IS_TARGET: - - FlagName = "NODE_IS_TARGET"; - break; - - case NODE_IS_RESOURCE_DESC: - - FlagName = "NODE_IS_RESOURCE_DESC"; - break; - - case NODE_IS_RESOURCE_FIELD: - - FlagName = "NODE_IS_RESOURCE_FIELD"; - break; - - case NODE_HAS_NO_EXIT: - - FlagName = "NODE_HAS_NO_EXIT"; - break; - - case NODE_IF_HAS_NO_EXIT: - - FlagName = "NODE_IF_HAS_NO_EXIT"; - break; - - case NODE_NAME_INTERNALIZED: - - FlagName = "NODE_NAME_INTERNALIZED"; - break; - - case NODE_METHOD_NO_RETVAL: - - FlagName = "NODE_METHOD_NO_RETVAL"; - break; - - case NODE_METHOD_SOME_NO_RETVAL: - - FlagName = "NODE_METHOD_SOME_NO_RETVAL"; - break; - - case NODE_RESULT_NOT_USED: - - FlagName = "NODE_RESULT_NOT_USED"; - break; - - case NODE_METHOD_TYPED: - - FlagName = "NODE_METHOD_TYPED"; - break; - - case NODE_COULD_NOT_REDUCE: - - FlagName = "NODE_COULD_NOT_REDUCE"; - break; - - case NODE_COMPILE_TIME_CONST: - - FlagName = "NODE_COMPILE_TIME_CONST"; - break; - - case NODE_IS_TERM_ARG: - - FlagName = "NODE_IS_TERM_ARG"; - break; - - case NODE_WAS_ONES_OP: - - FlagName = "NODE_WAS_ONES_OP"; - break; - - case NODE_IS_NAME_DECLARATION: - - FlagName = "NODE_IS_NAME_DECLARATION"; - break; - - case NODE_COMPILER_EMITTED: - - FlagName = "NODE_COMPILER_EMITTED"; - break; - - case NODE_IS_DUPLICATE: - - FlagName = "NODE_IS_DUPLICATE"; - break; - - case NODE_IS_RESOURCE_DATA: - - FlagName = "NODE_IS_RESOURCE_DATA"; - break; - - case NODE_IS_NULL_RETURN: - - FlagName = "NODE_IS_NULL_RETURN"; - break; - - default: - break; - } - - if (FlagName) - { - DbgPrint (ASL_PARSE_OUTPUT, " %s", FlagName); - FlagName = NULL; - } - - FlagBit <<= 1; - } -} - - -/******************************************************************************* - * - * FUNCTION: TrSetNodeFlags + * FUNCTION: TrSetOpFlags * - * PARAMETERS: Op - An existing parse node + * PARAMETERS: Op - An existing parse op * Flags - New flags word * * RETURN: The updated parser op * - * DESCRIPTION: Set bits in the node flags word. Will not clear bits, only set + * DESCRIPTION: Set bits in the op flags word. Will not clear bits, only set * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrSetNodeFlags ( +TrSetOpFlags ( ACPI_PARSE_OBJECT *Op, UINT32 Flags) { @@ -658,9 +288,9 @@ TrSetNodeFlags ( } DbgPrint (ASL_PARSE_OUTPUT, - "\nSetNodeFlags: %s Op %p, %8.8X", Op->Asl.ParseOpName, Op, Flags); + "\nSetOpFlags: %s Op %p, %8.8X", Op->Asl.ParseOpName, Op, Flags); - TrPrintNodeCompileFlags (Flags); + TrPrintOpFlags (Flags, ASL_PARSE_OUTPUT); DbgPrint (ASL_PARSE_OUTPUT, "\n\n"); Op->Asl.CompileFlags |= Flags; @@ -670,27 +300,27 @@ TrSetNodeFlags ( /******************************************************************************* * - * FUNCTION: TrSetNodeAmlLength + * FUNCTION: TrSetOpAmlLength * - * PARAMETERS: Op - An existing parse node + * PARAMETERS: Op - An existing parse op * Length - AML Length * * RETURN: The updated parser op * - * DESCRIPTION: Set the AML Length in a node. Used by the parser to indicate - * the presence of a node that must be reduced to a fixed length + * DESCRIPTION: Set the AML Length in a op. Used by the parser to indicate + * the presence of a op that must be reduced to a fixed length * constant. * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrSetNodeAmlLength ( +TrSetOpAmlLength ( ACPI_PARSE_OBJECT *Op, UINT32 Length) { DbgPrint (ASL_PARSE_OUTPUT, - "\nSetNodeAmlLength: Op %p, %8.8X\n", Op, Length); + "\nSetOpAmlLength: Op %p, %8.8X\n", Op, Length); if (!Op) { @@ -704,646 +334,95 @@ TrSetNodeAmlLength ( /******************************************************************************* * - * FUNCTION: TrSetEndLineNumber + * FUNCTION: TrSetOpParent * - * PARAMETERS: Op - An existing parse node + * PARAMETERS: Op - To be set to new parent + * ParentOp - The parent * - * RETURN: None. + * RETURN: None, sets Op parent directly * - * DESCRIPTION: Set the ending line numbers (file line and logical line) of a - * parse node to the current line numbers. + * DESCRIPTION: Change the parent of a parse op. * ******************************************************************************/ void -TrSetEndLineNumber ( - ACPI_PARSE_OBJECT *Op) -{ - - /* If the end line # is already set, just return */ - - if (Op->Asl.EndLine) - { - return; - } - - Op->Asl.EndLine = Gbl_CurrentLineNumber; - Op->Asl.EndLogicalLine = Gbl_LogicalLineNumber; -} - - -/******************************************************************************* - * - * FUNCTION: TrCreateAssignmentNode - * - * PARAMETERS: Target - Assignment target - * Source - Assignment source - * - * RETURN: Pointer to the new node. Aborts on allocation failure - * - * DESCRIPTION: Implements the C-style '=' operator. It changes the parse - * tree if possible to utilize the last argument of the math - * operators which is a target operand -- thus saving invocation - * of and additional Store() operator. An optimization. - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -TrCreateAssignmentNode ( - ACPI_PARSE_OBJECT *Target, - ACPI_PARSE_OBJECT *Source) -{ - ACPI_PARSE_OBJECT *TargetOp; - ACPI_PARSE_OBJECT *SourceOp1; - ACPI_PARSE_OBJECT *SourceOp2; - ACPI_PARSE_OBJECT *Operator; - - - DbgPrint (ASL_PARSE_OUTPUT, - "\nTrCreateAssignmentNode Line [%u to %u] Source %s Target %s\n", - Source->Asl.LineNumber, Source->Asl.EndLine, - UtGetOpName (Source->Asl.ParseOpcode), - UtGetOpName (Target->Asl.ParseOpcode)); - - TrSetNodeFlags (Target, NODE_IS_TARGET); - - switch (Source->Asl.ParseOpcode) - { - /* - * Only these operators can be optimized because they have - * a target operand - */ - case PARSEOP_ADD: - case PARSEOP_AND: - case PARSEOP_DIVIDE: - case PARSEOP_INDEX: - case PARSEOP_MOD: - case PARSEOP_MULTIPLY: - case PARSEOP_NOT: - case PARSEOP_OR: - case PARSEOP_SHIFTLEFT: - case PARSEOP_SHIFTRIGHT: - case PARSEOP_SUBTRACT: - case PARSEOP_XOR: - - break; - - /* Otherwise, just create a normal Store operator */ - - default: - - goto CannotOptimize; - } - - /* - * Transform the parse tree such that the target is moved to the - * last operand of the operator - */ - SourceOp1 = Source->Asl.Child; - SourceOp2 = SourceOp1->Asl.Next; - - /* NOT only has one operand, but has a target */ - - if (Source->Asl.ParseOpcode == PARSEOP_NOT) - { - SourceOp2 = SourceOp1; - } - - /* DIVIDE has an extra target operand (remainder) */ - - if (Source->Asl.ParseOpcode == PARSEOP_DIVIDE) - { - SourceOp2 = SourceOp2->Asl.Next; - } - - TargetOp = SourceOp2->Asl.Next; - - /* - * Can't perform this optimization if there already is a target - * for the operator (ZERO is a "no target" placeholder). - */ - if (TargetOp->Asl.ParseOpcode != PARSEOP_ZERO) - { - goto CannotOptimize; - } - - /* Link in the target as the final operand */ - - SourceOp2->Asl.Next = Target; - Target->Asl.Parent = Source; - - return (Source); - - -CannotOptimize: - - Operator = TrAllocateNode (PARSEOP_STORE); - TrLinkChildren (Operator, 2, Source, Target); - - /* Set the appropriate line numbers for the new node */ - - Operator->Asl.LineNumber = Target->Asl.LineNumber; - Operator->Asl.LogicalLineNumber = Target->Asl.LogicalLineNumber; - Operator->Asl.LogicalByteOffset = Target->Asl.LogicalByteOffset; - Operator->Asl.Column = Target->Asl.Column; - - return (Operator); -} - - -/******************************************************************************* - * - * FUNCTION: TrCreateLeafNode - * - * PARAMETERS: ParseOpcode - New opcode to be assigned to the node - * - * RETURN: Pointer to the new node. Aborts on allocation failure - * - * DESCRIPTION: Create a simple leaf node (no children or peers, and no value - * assigned to the node) - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -TrCreateLeafNode ( - UINT32 ParseOpcode) -{ - ACPI_PARSE_OBJECT *Op; - - - Op = TrAllocateNode (ParseOpcode); - - DbgPrint (ASL_PARSE_OUTPUT, - "\nCreateLeafNode Ln/Col %u/%u NewNode %p Op %s\n\n", - Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode)); - - return (Op); -} - - -/******************************************************************************* - * - * FUNCTION: TrCreateNullTarget - * - * PARAMETERS: None - * - * RETURN: Pointer to the new node. Aborts on allocation failure - * - * DESCRIPTION: Create a "null" target node. This is defined by the ACPI - * specification to be a zero AML opcode, and indicates that - * no target has been specified for the parent operation - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -TrCreateNullTarget ( - void) -{ - ACPI_PARSE_OBJECT *Op; - - - Op = TrAllocateNode (PARSEOP_ZERO); - Op->Asl.CompileFlags |= (NODE_IS_TARGET | NODE_COMPILE_TIME_CONST); - - DbgPrint (ASL_PARSE_OUTPUT, - "\nCreateNullTarget Ln/Col %u/%u NewNode %p Op %s\n", - Op->Asl.LineNumber, Op->Asl.Column, Op, - UtGetOpName (Op->Asl.ParseOpcode)); - - return (Op); -} - - -/******************************************************************************* - * - * FUNCTION: TrCreateConstantLeafNode - * - * PARAMETERS: ParseOpcode - The constant opcode - * - * RETURN: Pointer to the new node. Aborts on allocation failure - * - * DESCRIPTION: Create a leaf node (no children or peers) for one of the - * special constants - __LINE__, __FILE__, and __DATE__. - * - * Note: An implemenation of __FUNC__ cannot happen here because we don't - * have a full parse tree at this time and cannot find the parent control - * method. If it is ever needed, __FUNC__ must be implemented later, after - * the parse tree has been fully constructed. - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -TrCreateConstantLeafNode ( - UINT32 ParseOpcode) -{ - ACPI_PARSE_OBJECT *Op = NULL; - time_t CurrentTime; - char *StaticTimeString; - char *TimeString; - char *Filename; - - - switch (ParseOpcode) - { - case PARSEOP___LINE__: - - Op = TrAllocateNode (PARSEOP_INTEGER); - Op->Asl.Value.Integer = Op->Asl.LineNumber; - break; - - case PARSEOP___PATH__: - - Op = TrAllocateNode (PARSEOP_STRING_LITERAL); - - /* Op.Asl.Filename contains the full pathname to the file */ - - Op->Asl.Value.String = Op->Asl.Filename; - break; - - case PARSEOP___FILE__: - - Op = TrAllocateNode (PARSEOP_STRING_LITERAL); - - /* Get the simple filename from the full path */ - - FlSplitInputPathname (Op->Asl.Filename, NULL, &Filename); - Op->Asl.Value.String = Filename; - break; - - case PARSEOP___DATE__: - - Op = TrAllocateNode (PARSEOP_STRING_LITERAL); - - /* Get a copy of the current time */ - - CurrentTime = time (NULL); - StaticTimeString = ctime (&CurrentTime); - TimeString = UtLocalCalloc (strlen (StaticTimeString) + 1); - strcpy (TimeString, StaticTimeString); - - TimeString[strlen(TimeString) -1] = 0; /* Remove trailing newline */ - Op->Asl.Value.String = TimeString; - break; - - default: /* This would be an internal error */ - - return (NULL); - } - - DbgPrint (ASL_PARSE_OUTPUT, - "\nCreateConstantLeafNode Ln/Col %u/%u NewNode %p " - "Op %s Value %8.8X%8.8X \n", - Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode), - ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer)); - return (Op); -} - - -/******************************************************************************* - * - * FUNCTION: TrCreateTargetOperand - * - * PARAMETERS: OriginalOp - Op to be copied - * - * RETURN: Pointer to the new node. Aborts on allocation failure - * - * DESCRIPTION: Copy an existing node (and subtree). Used in ASL+ (C-style) - * expressions where the target is the same as one of the - * operands. A new node and subtree must be created from the - * original so that the parse tree can be linked properly. - * - * NOTE: This code is specific to target operands that are the last - * operand in an ASL/AML operator. Meaning that the top-level - * parse Op in a possible subtree has a NULL Next pointer. - * This simplifies the recursion. - * - * Subtree example: - * DeRefOf (Local1) += 32 - * - * This gets converted to: - * Add (DeRefOf (Local1), 32, DeRefOf (Local1)) - * - * Each DeRefOf has a single child, Local1. Even more complex - * subtrees can be created via the Index and DeRefOf operators. - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -TrCreateTargetOperand ( - ACPI_PARSE_OBJECT *OriginalOp, +TrSetOpParent ( + ACPI_PARSE_OBJECT *Op, ACPI_PARSE_OBJECT *ParentOp) { - ACPI_PARSE_OBJECT *Op; - - - if (!OriginalOp) - { - return (NULL); - } - - Op = TrGetNextNode (); - - /* Copy the pertinent values (omit link pointer fields) */ - - Op->Asl.Value = OriginalOp->Asl.Value; - Op->Asl.Filename = OriginalOp->Asl.Filename; - Op->Asl.LineNumber = OriginalOp->Asl.LineNumber; - Op->Asl.LogicalLineNumber = OriginalOp->Asl.LogicalLineNumber; - Op->Asl.LogicalByteOffset = OriginalOp->Asl.LogicalByteOffset; - Op->Asl.Column = OriginalOp->Asl.Column; - Op->Asl.Flags = OriginalOp->Asl.Flags; - Op->Asl.CompileFlags = OriginalOp->Asl.CompileFlags; - Op->Asl.AmlOpcode = OriginalOp->Asl.AmlOpcode; - Op->Asl.ParseOpcode = OriginalOp->Asl.ParseOpcode; - Op->Asl.Parent = ParentOp; - UtSetParseOpName (Op); - - /* Copy a possible subtree below this node */ - - if (OriginalOp->Asl.Child) - { - Op->Asl.Child = TrCreateTargetOperand (OriginalOp->Asl.Child, Op); - } - - if (OriginalOp->Asl.Next) /* Null for top-level node */ - { - Op->Asl.Next = TrCreateTargetOperand (OriginalOp->Asl.Next, ParentOp); - } - return (Op); + Op->Asl.Parent = ParentOp; } /******************************************************************************* * - * FUNCTION: TrCreateValuedLeafNode + * FUNCTION: TrSetOpCurrentFilename * - * PARAMETERS: ParseOpcode - New opcode to be assigned to the node - * Value - Value to be assigned to the node + * PARAMETERS: Op - An existing parse op * - * RETURN: Pointer to the new node. Aborts on allocation failure + * RETURN: None * - * DESCRIPTION: Create a leaf node (no children or peers) with a value - * assigned to it + * DESCRIPTION: Save the include file filename. Used for debug output only. * ******************************************************************************/ -ACPI_PARSE_OBJECT * -TrCreateValuedLeafNode ( - UINT32 ParseOpcode, - UINT64 Value) +void +TrSetOpCurrentFilename ( + ACPI_PARSE_OBJECT *Op) { - ACPI_PARSE_OBJECT *Op; - - - Op = TrAllocateNode (ParseOpcode); - - DbgPrint (ASL_PARSE_OUTPUT, - "\nCreateValuedLeafNode Ln/Col %u/%u NewNode %p " - "Op %s Value %8.8X%8.8X ", - Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName(ParseOpcode), - ACPI_FORMAT_UINT64 (Value)); - Op->Asl.Value.Integer = Value; - - switch (ParseOpcode) - { - case PARSEOP_STRING_LITERAL: - - DbgPrint (ASL_PARSE_OUTPUT, "STRING->%s", Value); - break; - case PARSEOP_NAMESEG: - - DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Value); - break; - - case PARSEOP_NAMESTRING: - - DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Value); - break; - - case PARSEOP_EISAID: - - DbgPrint (ASL_PARSE_OUTPUT, "EISAID->%s", Value); - break; - - case PARSEOP_METHOD: - - DbgPrint (ASL_PARSE_OUTPUT, "METHOD"); - break; - - case PARSEOP_INTEGER: - - DbgPrint (ASL_PARSE_OUTPUT, "INTEGER->%8.8X%8.8X", - ACPI_FORMAT_UINT64 (Value)); - break; - - default: - - break; - } - - DbgPrint (ASL_PARSE_OUTPUT, "\n\n"); - return (Op); + Op->Asl.Filename = Gbl_PreviousIncludeFilename; } /******************************************************************************* * - * FUNCTION: TrCreateNode + * FUNCTION: TrSetOpEndLineNumber * - * PARAMETERS: ParseOpcode - Opcode to be assigned to the node - * NumChildren - Number of children to follow - * ... - A list of child nodes to link to the new - * node. NumChildren long. + * PARAMETERS: Op - An existing parse op * - * RETURN: Pointer to the new node. Aborts on allocation failure + * RETURN: None. * - * DESCRIPTION: Create a new parse node and link together a list of child - * nodes underneath the new node. + * DESCRIPTION: Set the ending line numbers (file line and logical line) of a + * parse op to the current line numbers. * ******************************************************************************/ -ACPI_PARSE_OBJECT * -TrCreateNode ( - UINT32 ParseOpcode, - UINT32 NumChildren, - ...) +void +TrSetOpEndLineNumber ( + ACPI_PARSE_OBJECT *Op) { - ACPI_PARSE_OBJECT *Op; - ACPI_PARSE_OBJECT *Child; - ACPI_PARSE_OBJECT *PrevChild; - va_list ap; - UINT32 i; - BOOLEAN FirstChild; + /* If the end line # is already set, just return */ - va_start (ap, NumChildren); - - /* Allocate one new node */ - - Op = TrAllocateNode (ParseOpcode); - - DbgPrint (ASL_PARSE_OUTPUT, - "\nCreateNode Ln/Col %u/%u NewParent %p Child %u Op %s ", - Op->Asl.LineNumber, Op->Asl.Column, Op, - NumChildren, UtGetOpName(ParseOpcode)); - - /* Some extra debug output based on the parse opcode */ - - switch (ParseOpcode) - { - case PARSEOP_ASL_CODE: - - Gbl_ParseTreeRoot = Op; - Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; - DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); - break; - - case PARSEOP_DEFINITION_BLOCK: - - DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->"); - break; - - case PARSEOP_OPERATIONREGION: - - DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->"); - break; - - case PARSEOP_OR: - - DbgPrint (ASL_PARSE_OUTPUT, "OR->"); - break; - - default: - - /* Nothing to do for other opcodes */ - - break; - } - - /* Link the new node to its children */ - - PrevChild = NULL; - FirstChild = TRUE; - for (i = 0; i < NumChildren; i++) + if (Op->Asl.EndLine) { - /* Get the next child */ - - Child = va_arg (ap, ACPI_PARSE_OBJECT *); - DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child); - - /* - * If child is NULL, this means that an optional argument - * was omitted. We must create a placeholder with a special - * opcode (DEFAULT_ARG) so that the code generator will know - * that it must emit the correct default for this argument - */ - if (!Child) - { - Child = TrAllocateNode (PARSEOP_DEFAULT_ARG); - } - - /* Link first child to parent */ - - if (FirstChild) - { - FirstChild = FALSE; - Op->Asl.Child = Child; - - /* - * For the ASL-/ASL+ converter: if the ParseOp is a connection, - * external, offset or accessAs, it means that the comments in the - * FirstChild belongs to their parent due to the parsing order in - * the .y files. To correct this, take the comments in the - * FirstChild place it in the parent. This also means that - * legitimate comments for the child gets put to the parent. - */ - if (Gbl_CaptureComments && - ((ParseOpcode == PARSEOP_CONNECTION) || - (ParseOpcode == PARSEOP_EXTERNAL) || - (ParseOpcode == PARSEOP_OFFSET) || - (ParseOpcode == PARSEOP_ACCESSAS))) - { - Op->Asl.CommentList = Child->Asl.CommentList; - Op->Asl.EndBlkComment = Child->Asl.EndBlkComment; - Op->Asl.InlineComment = Child->Asl.InlineComment; - Op->Asl.FileChanged = Child->Asl.FileChanged; - - Child->Asl.CommentList = NULL; - Child->Asl.EndBlkComment = NULL; - Child->Asl.InlineComment = NULL; - Child->Asl.FileChanged = FALSE; - - /* - * These do not need to be "passed off". They can be copied - * because the code for these opcodes should be printed in the - * same file. - */ - Op->Asl.Filename = Child->Asl.Filename; - Op->Asl.ParentFilename = Child->Asl.ParentFilename; - } - } - - /* Point all children to parent */ - - Child->Asl.Parent = Op; - - /* Link children in a peer list */ - - if (PrevChild) - { - PrevChild->Asl.Next = Child; - }; - - /* Get the comment from last child in the resource template call */ - - if (Gbl_CaptureComments && - (Op->Asl.ParseOpcode == PARSEOP_RESOURCETEMPLATE)) - { - CvDbgPrint ("Transferred current comment list to this node.\n"); - Op->Asl.CommentList = Child->Asl.CommentList; - Child->Asl.CommentList = NULL; - Op->Asl.InlineComment = Child->Asl.InlineComment; - Child->Asl.InlineComment = NULL; - } - - /* - * This child might be a list, point all nodes in the list - * to the same parent - */ - while (Child->Asl.Next) - { - Child = Child->Asl.Next; - Child->Asl.Parent = Op; - } - - PrevChild = Child; + return; } - va_end(ap); - DbgPrint (ASL_PARSE_OUTPUT, "\n"); - return (Op); + Op->Asl.EndLine = Gbl_CurrentLineNumber; + Op->Asl.EndLogicalLine = Gbl_LogicalLineNumber; } /******************************************************************************* * - * FUNCTION: TrLinkChildren + * FUNCTION: TrLinkOpChildren * - * PARAMETERS: Op - An existing parse node + * PARAMETERS: Op - An existing parse op * NumChildren - Number of children to follow - * ... - A list of child nodes to link to the new - * node. NumChildren long. + * ... - A list of child ops to link to the new + * op. NumChildren long. * - * RETURN: The updated (linked) node + * RETURN: The updated (linked) op * - * DESCRIPTION: Link a group of nodes to an existing parse node + * DESCRIPTION: Link a group of ops to an existing parse op * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrLinkChildren ( +TrLinkOpChildren ( ACPI_PARSE_OBJECT *Op, UINT32 NumChildren, ...) @@ -1357,8 +436,7 @@ TrLinkChildren ( va_start (ap, NumChildren); - - TrSetEndLineNumber (Op); + TrSetOpEndLineNumber (Op); DbgPrint (ASL_PARSE_OUTPUT, "\nLinkChildren Line [%u to %u] NewParent %p Child %u Op %s ", @@ -1403,19 +481,19 @@ TrLinkChildren ( /* * If there are "regular comments" detected at this point, * then is an endBlk comment. Categorize it as so and distribute - * all regular comments to this parse node. + * all regular comments to this parse op. */ - if (Gbl_Comment_List_Head) + if (Gbl_CommentListHead) { - Op->Asl.EndBlkComment = Gbl_Comment_List_Head; + Op->Asl.EndBlkComment = Gbl_CommentListHead; CvDbgPrint ("EndBlk Comment for %s: %s", - Op->Asl.ParseOpName, Gbl_Comment_List_Head->Comment); - Gbl_Comment_List_Head = NULL; - Gbl_Comment_List_Tail = NULL; + Op->Asl.ParseOpName, Gbl_CommentListHead->Comment); + Gbl_CommentListHead = NULL; + Gbl_CommentListTail = NULL; } } - /* Link the new node to it's children */ + /* Link the new op to it's children */ PrevChild = NULL; FirstChild = TRUE; @@ -1426,7 +504,7 @@ TrLinkChildren ( if ((Child == PrevChild) && (Child != NULL)) { AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Child, - "Child node list invalid"); + "Child op list invalid"); va_end(ap); return (Op); } @@ -1441,7 +519,7 @@ TrLinkChildren ( */ if (!Child) { - Child = TrAllocateNode (PARSEOP_DEFAULT_ARG); + Child = TrAllocateOp (PARSEOP_DEFAULT_ARG); } /* Link first child to parent */ @@ -1461,10 +539,10 @@ TrLinkChildren ( if (PrevChild) { PrevChild->Asl.Next = Child; - }; + } /* - * This child might be a list, point all nodes in the list + * This child might be a list, point all ops in the list * to the same parent */ while (Child->Asl.Next) @@ -1479,31 +557,31 @@ TrLinkChildren ( va_end(ap); DbgPrint (ASL_PARSE_OUTPUT, "\n\n"); - if(Gbl_CaptureComments) { - Gbl_CommentState.Latest_Parse_Node = Op; - CvDbgPrint ("trlinkchildren=====Set latest parse node to this node.\n"); + Gbl_CommentState.LatestParseOp = Op; + CvDbgPrint ("TrLinkOpChildren=====Set latest parse op to this op.\n"); } + return (Op); } /******************************************************************************* * - * FUNCTION: TrLinkPeerNode + * FUNCTION: TrLinkPeerOp * * PARAMETERS: Op1 - First peer * Op2 - Second peer * - * RETURN: Op1 or the non-null node. + * RETURN: Op1 or the non-null op. * - * DESCRIPTION: Link two nodes as peers. Handles cases where one peer is null. + * DESCRIPTION: Link two ops as peers. Handles cases where one peer is null. * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrLinkPeerNode ( +TrLinkPeerOp ( ACPI_PARSE_OBJECT *Op1, ACPI_PARSE_OBJECT *Op2) { @@ -1511,18 +589,18 @@ TrLinkPeerNode ( DbgPrint (ASL_PARSE_OUTPUT, - "\nLinkPeerNode: 1=%p (%s), 2=%p (%s)\n", + "\nLinkPeerOp: 1=%p (%s), 2=%p (%s)\n", Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode) : NULL, Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode) : NULL); if ((!Op1) && (!Op2)) { - DbgPrint (ASL_PARSE_OUTPUT, "\nTwo Null nodes!\n"); + DbgPrint (ASL_PARSE_OUTPUT, "\nTwo Null ops!\n"); return (Op1); } - /* If one of the nodes is null, just return the non-null node */ + /* If one of the ops is null, just return the non-null op */ if (!Op2) { @@ -1537,10 +615,10 @@ TrLinkPeerNode ( if (Op1 == Op2) { DbgPrint (ASL_DEBUG_OUTPUT, - "\n************* Internal error, linking node to itself %p\n", + "\n************* Internal error, linking op to itself %p\n", Op1); AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op1, - "Linking node to itself"); + "Linking op to itself"); return (Op1); } @@ -1564,19 +642,19 @@ TrLinkPeerNode ( /******************************************************************************* * - * FUNCTION: TrLinkPeerNodes + * FUNCTION: TrLinkPeerOps * - * PARAMETERS: NumPeers - The number of nodes in the list to follow - * ... - A list of nodes to link together as peers + * PARAMETERS: NumPeers - The number of ops in the list to follow + * ... - A list of ops to link together as peers * - * RETURN: The first node in the list (head of the peer list) + * RETURN: The first op in the list (head of the peer list) * - * DESCRIPTION: Link together an arbitrary number of peer nodes. + * DESCRIPTION: Link together an arbitrary number of peer ops. * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrLinkPeerNodes ( +TrLinkPeerOps ( UINT32 NumPeers, ...) { @@ -1588,7 +666,7 @@ TrLinkPeerNodes ( DbgPrint (ASL_PARSE_OUTPUT, - "\nLinkPeerNodes: (%u) ", NumPeers); + "\nLinkPeerOps: (%u) ", NumPeers); va_start (ap, NumPeers); This = va_arg (ap, ACPI_PARSE_OBJECT *); @@ -1606,21 +684,21 @@ TrLinkPeerNodes ( This = This->Asl.Next; } - /* Get another peer node */ + /* Get another peer op */ Next = va_arg (ap, ACPI_PARSE_OBJECT *); if (!Next) { - Next = TrAllocateNode (PARSEOP_DEFAULT_ARG); + Next = TrAllocateOp (PARSEOP_DEFAULT_ARG); } - /* link new node to the current node */ + /* link new op to the current op */ This->Asl.Next = Next; This = Next; } - va_end (ap); + va_end (ap); DbgPrint (ASL_PARSE_OUTPUT,"\n"); return (Start); } @@ -1628,19 +706,19 @@ TrLinkPeerNodes ( /******************************************************************************* * - * FUNCTION: TrLinkChildNode + * FUNCTION: TrLinkChildOp * - * PARAMETERS: Op1 - Parent node + * PARAMETERS: Op1 - Parent op * Op2 - Op to become a child * - * RETURN: The parent node + * RETURN: The parent op * - * DESCRIPTION: Link two nodes together as a parent and child + * DESCRIPTION: Link two ops together as a parent and child * ******************************************************************************/ ACPI_PARSE_OBJECT * -TrLinkChildNode ( +TrLinkChildOp ( ACPI_PARSE_OBJECT *Op1, ACPI_PARSE_OBJECT *Op2) { @@ -1648,23 +726,24 @@ TrLinkChildNode ( DbgPrint (ASL_PARSE_OUTPUT, - "\nLinkChildNode: Parent=%p (%s), Child=%p (%s)\n", + "\nLinkChildOp: Parent=%p (%s), Child=%p (%s)\n", Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode): NULL, Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode): NULL); /* - * Converter: if TrLinkChildNode is called to link a method call, + * Converter: if TrLinkChildOp is called to link a method call, * turn on capture comments as it signifies that we are done parsing * a method call. */ - if (Gbl_CaptureComments) + if (Gbl_CaptureComments && Op1) { if (Op1->Asl.ParseOpcode == PARSEOP_METHODCALL) { Gbl_CommentState.CaptureComments = TRUE; } - Gbl_CommentState.Latest_Parse_Node = Op1; + Gbl_CommentState.LatestParseOp = Op1; } + if (!Op1 || !Op2) { return (Op1); @@ -1689,7 +768,8 @@ TrLinkChildNode ( * * FUNCTION: TrWalkParseTree * - * PARAMETERS: Visitation - Type of walk + * PARAMETERS: Op - Walk starting point + * Visitation - Type of walk * DescendingCallback - Called during tree descent * AscendingCallback - Called during tree ascent * Context - To be passed to the callbacks @@ -1709,7 +789,7 @@ TrWalkParseTree ( void *Context) { UINT32 Level; - BOOLEAN NodePreviouslyVisited; + BOOLEAN OpPreviouslyVisited; ACPI_PARSE_OBJECT *StartOp = Op; ACPI_STATUS Status; @@ -1720,7 +800,7 @@ TrWalkParseTree ( } Level = 0; - NodePreviouslyVisited = FALSE; + OpPreviouslyVisited = FALSE; switch (Visitation) { @@ -1728,9 +808,9 @@ TrWalkParseTree ( while (Op) { - if (!NodePreviouslyVisited) + if (!OpPreviouslyVisited) { - /* Let the callback process the node. */ + /* Let the callback process the op. */ Status = DescendingCallback (Op, Level, Context); if (ACPI_SUCCESS (Status)) @@ -1764,7 +844,7 @@ TrWalkParseTree ( if (Op->Asl.Next) { Op = Op->Asl.Next; - NodePreviouslyVisited = FALSE; + OpPreviouslyVisited = FALSE; } else { @@ -1775,7 +855,7 @@ TrWalkParseTree ( Level--; } Op = Op->Asl.Parent; - NodePreviouslyVisited = TRUE; + OpPreviouslyVisited = TRUE; } } break; @@ -1784,12 +864,12 @@ TrWalkParseTree ( while (Op) { - /* Visit leaf node (no children) or parent node on return trip */ + /* Visit leaf op (no children) or parent op on return trip */ if ((!Op->Asl.Child) || - (NodePreviouslyVisited)) + (OpPreviouslyVisited)) { - /* Let the callback process the node. */ + /* Let the callback process the op. */ Status = AscendingCallback (Op, Level, Context); if (ACPI_FAILURE (Status)) @@ -1818,7 +898,7 @@ TrWalkParseTree ( if (Op->Asl.Next) { Op = Op->Asl.Next; - NodePreviouslyVisited = FALSE; + OpPreviouslyVisited = FALSE; } else { @@ -1829,7 +909,7 @@ TrWalkParseTree ( Level--; } Op = Op->Asl.Parent; - NodePreviouslyVisited = TRUE; + OpPreviouslyVisited = TRUE; } } break; @@ -1838,7 +918,7 @@ TrWalkParseTree ( while (Op) { - if (NodePreviouslyVisited) + if (OpPreviouslyVisited) { Status = AscendingCallback (Op, Level, Context); if (ACPI_FAILURE (Status)) @@ -1848,7 +928,7 @@ TrWalkParseTree ( } else { - /* Let the callback process the node. */ + /* Let the callback process the op. */ Status = DescendingCallback (Op, Level, Context); if (ACPI_SUCCESS (Status)) @@ -1882,7 +962,7 @@ TrWalkParseTree ( if (Op->Asl.Next) { Op = Op->Asl.Next; - NodePreviouslyVisited = FALSE; + OpPreviouslyVisited = FALSE; } else { @@ -1893,7 +973,7 @@ TrWalkParseTree ( Level--; } Op = Op->Asl.Parent; - NodePreviouslyVisited = TRUE; + OpPreviouslyVisited = TRUE; } } break; |