Class AbstractMasterOptimizer<T extends IOptimizerTarget>

java.lang.Object
com.pnfsoftware.jeb.core.units.code.asm.decompiler.opt.AbstractMasterOptimizer<T>
All Implemented Interfaces:
IMasterOptimizer<T>
Direct Known Subclasses:
CMasterOptimizer, EMasterOptimizer

public abstract class AbstractMasterOptimizer<T extends IOptimizerTarget> extends Object implements IMasterOptimizer<T>
Standard implementation of a generic master optimizer.
  • Field Details

    • t

      protected T extends IOptimizerTarget t
      default target
    • optGrpMap

      protected SortedMap<Integer,List<OptimizerEntry<T extends IOptimizerTarget>>> optGrpMap
      groups of optimizers; groups 0 and -1 are entry and exit groups, respectively
    • optList

      protected List<OptimizerEntry<T extends IOptimizerTarget>> optList
      list of all optimizers
    • grp1NMaxRunCount

      protected int grp1NMaxRunCount
      maximum run count for the group [1..N] (<0 means no limit)
    • instrumenters

      protected List<IMasterOptimizerInstrumenter<T extends IOptimizerTarget>> instrumenters
      instrumenters
    • enableUnsafeOptimizers

      protected boolean enableUnsafeOptimizers
      false by default; client code must explicitly set to true to allow the execution of unsafe optimizers.
    • enableDeobfuscators

      protected boolean enableDeobfuscators
      false by default; client code must explicitly set to true to allow the execution of deobfuscators.
    • decryptorSupport

      protected int decryptorSupport
      disabled (0) by default; client code must explicitly set to non-zero to allow the execution of decryptors.
  • Constructor Details

    • AbstractMasterOptimizer

      public AbstractMasterOptimizer(T t, int grp1NMaxRunCount)
      Create a master optimizer.
      Parameters:
      t - the default target, may be null
      grp1NMaxRunCount - maximum run count for the group [1..N]
  • Method Details

    • getTarget

      public T getTarget()
      Description copied from interface: IMasterOptimizer
      Get the target onto which the optimizations will be performed.
      Specified by:
      getTarget in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • setTarget

      public void setTarget(T t)
      Description copied from interface: IMasterOptimizer
      Set the optimizer's target.
      Specified by:
      setTarget in interface IMasterOptimizer<T extends IOptimizerTarget>
    • setMode

      public OptimizerMode setMode(OptimizerMode mode)
      Specified by:
      setMode in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
      the previous mode
    • getMode

      public OptimizerMode getMode()
      Description copied from interface: IMasterOptimizer
      Retrieve the current operating mode for this MO.
      Specified by:
      getMode in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
      the current operating mode
    • setEnableUnsafeOptimizers

      public void setEnableUnsafeOptimizers(boolean enabled)
    • isEnableUnsafeOptimizers

      public boolean isEnableUnsafeOptimizers()
    • setEnableDeobfuscators

      public void setEnableDeobfuscators(boolean enabled)
    • isEnableDeobfuscators

      public boolean isEnableDeobfuscators()
    • setDecryptorSupport

      public void setDecryptorSupport(int value)
    • getDecryptorSupport

      public int getDecryptorSupport()
    • setPolicyForOptimizerTag

      public void setPolicyForOptimizerTag(String tag, boolean allowed)
      Description copied from interface: IMasterOptimizer
      Set the running policy associated to a tag or group of tags. Policy checks when deciding whether an optimizer should be run works as follow: 1) the tag must be allowed, 2) if passed, the tag must not be blocked. By default, all tags are allowed, none are blocked. To reset to that default policy: first invoke this method with ("*", true), then invoke it with (null, false).
      Specified by:
      setPolicyForOptimizerTag in interface IMasterOptimizer<T extends IOptimizerTarget>
      Parameters:
      tag - tag name; the special name "*" means all tags; the special name "" (empty string) or null string means no tag
      allowed - true to allow the master optimizer to run the optimizer with the specified tag; false to block it
    • registerOptimizer

      public OptimizerEntry<T> registerOptimizer(IOptimizer<T> opt)
      Description copied from interface: IMasterOptimizer
      Register an optimizer to the main group, using the optimizer's provided default priority. Refer to IOptimizer#getDefaultPriority().
      Specified by:
      registerOptimizer in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • registerOptimizer

      public OptimizerEntry<T> registerOptimizer(int group, IOptimizer<T> opt)
      Description copied from interface: IMasterOptimizer
      Register an optimizer, using the optimizer's provided default priority. Refer to IOptimizer#getDefaultPriority().
      Specified by:
      registerOptimizer in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • unregisterOptimizer

      public boolean unregisterOptimizer(OptimizerEntry<T> e)
      Description copied from interface: IMasterOptimizer
      Remove an optimizer.
      Specified by:
      unregisterOptimizer in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • unregisterAllOptimizers

      public void unregisterAllOptimizers()
    • getRegisteredOptimizers

      public List<OptimizerEntry<T>> getRegisteredOptimizers()
      Description copied from interface: IMasterOptimizer
      Get a copy of the list of optimizer entries registered with this MO.
      Specified by:
      getRegisteredOptimizers in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • getRegisteredOptimizers

      public List<OptimizerEntry<T>> getRegisteredOptimizers(int groupId)
      Description copied from interface: IMasterOptimizer
      Get a copy of the lists of optimizer entries registered with this MO and belonging to the provided optimizer group.
      Specified by:
      getRegisteredOptimizers in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • getOptimizer

      public OptimizerEntry<T> getOptimizer(Class<? extends IOptimizer<T>> clazz)
      Specified by:
      getOptimizer in interface IMasterOptimizer<T extends IOptimizerTarget>
    • getTotalOptimizationCount

      public int getTotalOptimizationCount()
      Specified by:
      getTotalOptimizationCount in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • getOptimizationCount

      public int getOptimizationCount(boolean deobfuscationOnly)
      Specified by:
      getOptimizationCount in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
    • getOptimizerObject

      public IOptimizer<T> getOptimizerObject(Class<? extends IOptimizer<T>> clazz)
      Specified by:
      getOptimizerObject in interface IMasterOptimizer<T extends IOptimizerTarget>
    • perform

      public int perform()
      Description copied from interface: IMasterOptimizer
      Perform an optimization pass. All the optimizers will be run according to this master's schedule. They may be run multiple times.
      Specified by:
      perform in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
      the total number of optimizations performed
    • performV1

      protected int performV1()
    • performV2

      protected int performV2(boolean rerunFromStartAfterOpt)
    • performMultiple

      public int performMultiple(List<OptimizerEntry<T>> list)
      Description copied from interface: IMasterOptimizer
      Run the list of optimizers, in sequence. Each optimizer is run once.
      Specified by:
      performMultiple in interface IMasterOptimizer<T extends IOptimizerTarget>
      Parameters:
      list - a list of optimizers
      Returns:
      the total number of optimizations performed
    • performSingle

      public int performSingle(OptimizerEntry<T> e)
      Description copied from interface: IMasterOptimizer
      Perform a single optimization, using the provided optimizer (which must have been previously registered).
      Specified by:
      performSingle in interface IMasterOptimizer<T extends IOptimizerTarget>
      Parameters:
      e - an optimizer
      Returns:
      the total number of optimizations performed
    • preAllOptimizationsCallback

      protected void preAllOptimizationsCallback(T target)
      This method might be overridden, but the parent should be called first.
    • preOptimizationCallback

      protected void preOptimizationCallback(T target, OptimizerEntry<T> e)
      This method might be overridden, but the parent should be called first. Note that this method might have a big impact on decompilation performance, so override carefully.
    • postAllOptimizationsCallback

      protected void postAllOptimizationsCallback(T target)
      This method might be overridden, but the parent should be called first.
    • postOptimizationCallback

      protected void postOptimizationCallback(T target, OptimizerEntry<T> e, int cnt, long executionTimeMs)
      This method might be overridden, but the parent should be called first. Note that this method might have a big impact on decompilation performance, so override carefully.
    • registerInstrumenter

      public void registerInstrumenter(IMasterOptimizerInstrumenter<T> instrumenter)
      Description copied from interface: IMasterOptimizer
      Register an instrumenter. Instrumenters will be called following their registration order.
      Specified by:
      registerInstrumenter in interface IMasterOptimizer<T extends IOptimizerTarget>
    • unregisterInstrumenter

      public boolean unregisterInstrumenter(IMasterOptimizerInstrumenter<T> instrumenter)
      Description copied from interface: IMasterOptimizer
      Unregister an instrumenter
      Specified by:
      unregisterInstrumenter in interface IMasterOptimizer<T extends IOptimizerTarget>
      Returns:
      true if the instrumenter was removed, false otherwise
    • onOptimizerException

      protected boolean onOptimizerException(T target, IOptimizer<T> opt, Exception ex)
      This method is called when an optimizer hard-failed and generated an exception.
      Parameters:
      target - the target that being optimized
      opt - the failing optimizer
      ex - the generated exception
      Returns:
      if true, the exception will be neutered and the master optimizer will resume the optimizing process; else, the exception will be thrown
    • retrievePerformanceCounters

      public OptimizersPerformanceCounters retrievePerformanceCounters()
    • getTargetAddress

      protected abstract String getTargetAddress(T target)