Merge pull request #211 from debox1/feature-ex-in-place

compiler: disassembler: compile and disassemble externals in place
This commit is contained in:
Robert Moore 2017-02-24 13:11:14 -08:00 committed by GitHub
commit 0c0d43e8a2
7 changed files with 73 additions and 9 deletions

View File

@ -1234,6 +1234,29 @@ AcpiDmEmitExternals (
AcpiOsPrintf ("\n");
}
/*******************************************************************************
*
* FUNCTION: AcpiDmEmitExternal
*
* PARAMETERS: Op External Parse Object
*
* RETURN: None
*
* DESCRIPTION: Emit an External() ASL statement for the current External
* parse object
*
******************************************************************************/
void
AcpiDmEmitExternal (
ACPI_PARSE_OBJECT *NameOp,
ACPI_PARSE_OBJECT *TypeOp)
{
AcpiOsPrintf ("External (");
AcpiDmNamestring (NameOp->Common.Value.Name);
AcpiOsPrintf ("%s)\n",
AcpiDmGetObjectTypeName (TypeOp->Common.Value.Integer));
}
/*******************************************************************************
*

View File

@ -357,8 +357,17 @@ CmDoCompile (
{
Event = UtBeginEvent ("Resolve all Externals");
DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n");
TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL);
if (Gbl_DoExternalsInPlace)
{
TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
ExAmlExternalWalkBegin, NULL, NULL);
}
else
{
TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL);
}
UtEndEvent (Event);
}

View File

@ -254,6 +254,7 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_PruneParseTree, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DoTypechecking, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_EnableReferenceTypechecking, FALSE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DoExternals, TRUE);
ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DoExternalsInPlace, FALSE);
#define HEX_OUTPUT_NONE 0

View File

@ -647,6 +647,16 @@ AslDoOptions (
AcpiGbl_DmEmitExternalOpcodes = TRUE;
break;
case 'E':
/*
* iASL: keep External opcodes in place.
* No affect if Gbl_DoExternals is false.
*/
Gbl_DoExternalsInPlace = TRUE;
break;
case 'f':
/* Disable folding on "normal" expressions */

View File

@ -1078,15 +1078,13 @@ AcpiDmDisassembleOneOp (
if (AcpiGbl_DmEmitExternalOpcodes)
{
AcpiOsPrintf ("/* Opcode 0x15 */ ");
/* Fallthrough */
}
else
{
AcpiDmEmitExternal (AcpiPsGetArg(Op, 0),
AcpiPsGetArg(Op, 1));
break;
}
break;
default:
/* Just get the opcode name and print it */

View File

@ -135,6 +135,14 @@ AcpiDmEmitExternals (
{
return;
}
void
AcpiDmEmitExternal (
ACPI_PARSE_OBJECT *NameOp,
ACPI_PARSE_OBJECT *TypeOp)
{
return;
}
#endif
/* Local prototypes */
@ -600,7 +608,11 @@ AcpiDmDescendingOp (
/* Emit all External() declarations here */
AcpiDmEmitExternals ();
if (!AcpiGbl_DmEmitExternalOpcodes)
{
AcpiDmEmitExternals ();
}
return (AE_OK);
}
}
@ -679,6 +691,12 @@ AcpiDmDescendingOp (
Info->Level--;
}
if (Op->Common.AmlOpcode == AML_EXTERNAL_OP)
{
Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
return (AE_CTRL_DEPTH);
}
/* Start the opcode argument list if necessary */
if ((OpInfo->Flags & AML_HAS_ARGS) ||

View File

@ -874,6 +874,11 @@ void
AcpiDmEmitExternals (
void);
void
AcpiDmEmitExternal (
ACPI_PARSE_OBJECT *NameOp,
ACPI_PARSE_OBJECT *TypeOp);
void
AcpiDmUnresolvedWarning (
UINT8 Type);