/* ### * IP: GHIDRA * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /// \file override.hh /// \brief A system for sending override commands to the decompiler #ifndef __OVERRIDE__ #define __OVERRIDE__ #include "database.hh" class FuncCallSpecs; // Forward declaration /// \brief A container of commands that override the decompiler's default behavior for a single function /// /// Information about a particular function that can be overridden includes: /// - sub-functions: How they are called and where they call to /// - jumptables: Mark indirect jumps that need multistage analysis /// - deadcode: Details about how dead code is eliminated /// - data-flow: Override the interpretation of specific branch instructions /// /// Commands exist independently of the main data-flow, control-flow, and symbol structures /// and survive decompilation restart. A few analyses, mid transformation, insert a new command /// to fix a problem that was discovered too late and then force a restart via Funcdata::setRestartPending() /// /// The class accept new commands via the insert* methods. The decompiler applies them by /// calling the apply* or get* methods. class Override { public: /// \brief Enumeration of possible branch overrides enum { NONE = 0, ///< No override BRANCH = 1, ///< Replace primary CALL or RETURN with suitable BRANCH operation CALL = 2, ///< Replace primary BRANCH or RETURN with suitable CALL operation CALL_RETURN = 3, ///< Replace primary BRANCH or RETURN with suitable CALL/RETURN operation RETURN = 4 ///< Replace primary BRANCH or CALL with a suitable RETURN operation }; private: map
forcegoto; ///< Force goto on jump at \b targetpc to \b destpc vector