public BuildSignatures ( DecompilerEventListener listener ) : void | ||
listener | DecompilerEventListener | |
return | void |
/// <summary> /// Summarizes the net effect each procedure has on registers, /// then removes trashed registers that aren't live-out. /// </summary> public List <SsaTransform> UntangleProcedures() { eventListener.ShowProgress("Rewriting procedures.", 0, program.Procedures.Count); IntraBlockDeadRegisters.Apply(program, eventListener); AdjacentBranchCollector.Transform(program, eventListener); var ssts = RewriteProceduresToSsa(); // Recreate user-defined signatures. It should prevent type // inference between user-defined parameters and other expressions var usb = new UserSignatureBuilder(program); usb.BuildSignatures(eventListener); // Discover ssaId's that are live out at each call site. // Delete all others. var uvr = new UnusedOutValuesRemover( program, ssts.Select(sst => sst.SsaState), this.flow, dynamicLinker, eventListener); uvr.Transform(); // At this point, the exit blocks contain only live out registers. // We can create signatures from that. CallRewriter.Rewrite(program.Platform, ssts, this.flow, eventListener); return(ssts); }
public void Usb_EmptyUserSignature() { Given_Procedure(0x1000); var oldSig = proc.Signature; var usb = new UserSignatureBuilder(program); usb.BuildSignatures(); Assert.AreSame(oldSig, proc.Signature); }
public void Usb_EmptyUserSignature() { Given_Procedure(0x1000); var oldSig = proc.Signature; var usb = new UserSignatureBuilder(program); usb.BuildSignatures(new FakeDecompilerEventListener()); Assert.AreSame(oldSig, proc.Signature); }
// EXPERIMENTAL - consult uxmal before using /// <summary> /// Analyizes the procedures of a program by finding all strongly /// connected components (SCCs) and processing the SCCs one by one. /// </summary> public void AnalyzeProgram2() { var usb = new UserSignatureBuilder(program); usb.BuildSignatures(); var sscf = new SccFinder <Procedure>(new ProcedureGraph(program), UntangleProcedureScc); foreach (var procedure in program.Procedures.Values) { sscf.Find(procedure); } }
/// <summary> /// Finds all interprocedural register dependencies (in- and out-parameters) and /// abstracts them away by rewriting as calls. /// </summary> /// <returns>A RegisterLiveness object that summarizes the interprocedural register /// liveness analysis. This information can be used to generate SSA form. /// </returns> public void UntangleProcedures() { eventListener.ShowStatus("Eliminating intra-block dead registers."); var usb = new UserSignatureBuilder(program); usb.BuildSignatures(eventListener); CallRewriter.Rewrite(program, eventListener); IntraBlockDeadRegisters.Apply(program, eventListener); eventListener.ShowStatus("Finding terminating procedures."); var term = new TerminationAnalysis(flow, eventListener); term.Analyze(program); eventListener.ShowStatus("Finding trashed registers."); var trf = new TrashedRegisterFinder(program, program.Procedures.Values, flow, eventListener); trf.Compute(); eventListener.ShowStatus("Rewriting affine expressions."); trf.RewriteBasicBlocks(); eventListener.ShowStatus("Computing register liveness."); RegisterLiveness.Compute(program, flow, eventListener); eventListener.ShowStatus("Rewriting calls."); GlobalCallRewriter.Rewrite(program, flow, eventListener); }
/// <summary> /// Finds all interprocedural register dependencies (in- and out-parameters) and /// abstracts them away by rewriting as calls. /// </summary> /// <returns>A RegisterLiveness object that summarizes the interprocedural register /// liveness analysis. This information can be used to generate SSA form. /// </returns> public void UntangleProcedures() { eventListener.ShowStatus("Eliminating intra-block dead registers."); var usb = new UserSignatureBuilder(program); usb.BuildSignatures(); CallRewriter.Rewrite(program); IntraBlockDeadRegisters.Apply(program); eventListener.ShowStatus("Finding terminating procedures."); var term = new TerminationAnalysis(flow); term.Analyze(program); eventListener.ShowStatus("Finding trashed registers."); var trf = new TrashedRegisterFinder(program, program.Procedures.Values, flow, eventListener); trf.Compute(); eventListener.ShowStatus("Rewriting affine expressions."); trf.RewriteBasicBlocks(); eventListener.ShowStatus("Computing register liveness."); var rl = RegisterLiveness.Compute(program, flow, eventListener); eventListener.ShowStatus("Rewriting calls."); GlobalCallRewriter.Rewrite(program, flow); }
public void Usb_BuildSignatures_UserDefinedTypes() { var platformTypes = new Dictionary<string, DataType>() { { "PLATFORMDEF", PrimitiveType.Create(PrimitiveType.Byte.Domain, 1) }, }; var userDefinedTypes = new Dictionary<string, DataType>() { { "USRDEF", PrimitiveType.Create( PrimitiveType.Int16.Domain, 2 ) }, }; mockFactory.Given_PlatformTypes(platformTypes); mockFactory.Given_UserDefinedMetafile("mod", userDefinedTypes, null, null); Given_Procedure(0x1000); Given_UserSignature(0x01000, "int test(PLATFORMDEF a, USRDEF b)"); var usb = new UserSignatureBuilder(program); usb.BuildSignatures(); var sigExp = @"Register int32 ()(Stack PLATFORMDEF a, Stack USRDEF b) // stackDelta: 4; fpuStackDelta: 0; fpuMaxParam: -1 "; Assert.AreEqual(sigExp, proc.Signature.ToString()); Assert.AreEqual(2, proc.Signature.Parameters.Length); Assert.AreEqual("int32", proc.Signature.ReturnValue.DataType.ToString()); Assert.AreEqual("a", proc.Signature.Parameters[0].Name); Assert.AreEqual("byte", (proc.Signature.Parameters[0].DataType as TypeReference).Referent.ToString()); Assert.AreEqual("b", proc.Signature.Parameters[1].Name); Assert.AreEqual("int16", (proc.Signature.Parameters[1].DataType as TypeReference).Referent.ToString()); }
public void Usb_BuildSignatures_UserDefinedTypes() { program.EnvironmentMetadata.Types.Add( "PLATFORMDEF", PrimitiveType.Create(PrimitiveType.Byte.Domain, 1)); program.EnvironmentMetadata.Types.Add( "USRDEF", PrimitiveType.Create(PrimitiveType.Int16.Domain, 2)); Given_Procedure(0x1000); Given_UserSignature(0x01000, "int test(PLATFORMDEF a, USRDEF b)"); var usb = new UserSignatureBuilder(program); usb.BuildSignatures(new FakeDecompilerEventListener()); var sigExp = @"Register int32 test(Stack PLATFORMDEF a, Stack USRDEF b) // stackDelta: 4; fpuStackDelta: 0; fpuMaxParam: -1 "; Assert.AreEqual(sigExp, proc.Signature.ToString("test", FunctionType.EmitFlags.AllDetails)); Assert.AreEqual(2, proc.Signature.Parameters.Length); Assert.AreEqual("int32", proc.Signature.ReturnValue.DataType.ToString()); Assert.AreEqual("a", proc.Signature.Parameters[0].Name); Assert.AreEqual("byte", (proc.Signature.Parameters[0].DataType as TypeReference).Referent.ToString()); Assert.AreEqual("b", proc.Signature.Parameters[1].Name); Assert.AreEqual("int16", (proc.Signature.Parameters[1].DataType as TypeReference).Referent.ToString()); }
// EXPERIMENTAL - consult uxmal before using /// <summary> /// Analyizes the procedures of a program by finding all strongly /// connected components (SCCs) and processing the SCCs one by one. /// </summary> public void AnalyzeProgram2() { var usb = new UserSignatureBuilder(program); usb.BuildSignatures(); var sscf = new SccFinder<Procedure>(new ProcedureGraph(program), UntangleProcedureScc); foreach (var procedure in program.Procedures.Values) { sscf.Find(procedure); } }